我的情况是这样的。 为安全起见,我决定我把应用程序的数据捆绑和用户数据的文档目录。 问题是如何从不同的数据库连接表? 如果无法做到我必须创建一个表来在文件目录下的数据库?
Answer 1:
SQLITE3允许其国外数据库附加到当前连接。 试想一下,你有两个数据库,每一个保持经由FMDatabase一个自己的连接(多线程的目的,你应该使用FMDatabaseQueue代替)。 现在,其他的数据库附加到的第一个数据库的连接。 然后你就可以从数据库中加入1中的表数据库2.重要:通过每sql语句源码这一切发生,无关与FMDB。
我会在github上提供了示例代码: https://github.com/itinance/MultiDatabaseJoin
为了简单起见,我把/ TMP-目录下的数据库文件。 有了这个运作良好的iOS模拟器,我还没有一个真正的设备,在那里你会放置在文件夹或类似的东西数据库(但那不是点还)测试此代码。
这里最重要的是sqlite3的以下查询:
[db1 executeStatements:@"ATTACH DATABASE '/tmp/tmp2.db' AS second_db"];
在数据库连接DB 1,我们重视从第二数据库的数据库文件。
在此之后安装,你可以在这样一个查询数据库,连接1到表中的数据库连接2加入:
SELECT a.id, a.name AS aname, b.name AS bname FROM a INNER JOIN second_db.b ON b.a_id = a.id
这里是整个代码我尝试:
FMDatabase *db1 = [FMDatabase databaseWithPath:@"/tmp/tmp1.db"];
FMDatabase *db2 = [FMDatabase databaseWithPath:@"/tmp/tmp2.db"];
[db1 open];
[db2 open];
[db1 executeStatements:@"CREATE TABLE a (id INTEGER, name TEXT)"];
[db1 executeStatements:@"INSERT INTO a (id, name) VALUES (1, 'foo'), (2, 'bar')"];
[db2 executeStatements:@"CREATE TABLE b (id INTEGER, a_id INTEGER, name TEXT)"];
[db2 executeStatements:@"INSERT INTO b (id, a_id, name) VALUES (1, 1, 'b_foo'), (2, 2, 'b_bar')"];
bool success = [db1 executeStatements:@"ATTACH DATABASE '/tmp/tmp2.db' AS second_db"];
if(!success) {
NSLog(@"%@", db1.lastErrorMessage);
return YES;
}
FMResultSet* rs = [db1 executeQuery:@"SELECT a.id, a.name AS aname, b.name AS bname FROM a INNER JOIN second_db.b ON b.a_id = a.id"];
while( [rs next]) {
NSLog(@"%@, %@", [rs stringForColumn:@"aname"], [rs stringForColumn:@"bname"]);
}
[rs close];
文章来源: How to join two tables from two different databases in FMDB in a iOS app