如何在iOS应用程序中连接FMDB中两个不同数据库中的两个表

如何在iOS应用程序中连接FMDB中两个不同数据库中的两个表,ios,sqlite,fmdb,Ios,Sqlite,Fmdb,我的情况是这样的。 出于安全原因,我决定将应用程序数据放入捆绑包,将用户数据放入文档目录。 问题是如何连接来自不同数据库的表? 如果不可能,我是否必须为文档目录中的数据库创建一个表?Sqlite3允许它将外部数据库附加到当前连接。 想象一下,您有两个数据库,每个数据库通过FMDatabase拥有自己的连接(为了多线程目的,您应该使用FMDatabaseQueue)。 现在,将另一个数据库连接到第一个数据库的连接。然后可以从数据库1连接到数据库2中的表。重要提示:所有这些都是通过sqlite pe

我的情况是这样的。 出于安全原因,我决定将应用程序数据放入捆绑包,将用户数据放入文档目录。 问题是如何连接来自不同数据库的表?
如果不可能,我是否必须为文档目录中的数据库创建一个表?

Sqlite3允许它将外部数据库附加到当前连接。 想象一下,您有两个数据库,每个数据库通过FMDatabase拥有自己的连接(为了多线程目的,您应该使用FMDatabaseQueue)。 现在,将另一个数据库连接到第一个数据库的连接。然后可以从数据库1连接到数据库2中的表。重要提示:所有这些都是通过sqlite per sql语句实现的,与FMDB无关

我将在github上提供示例代码:

为了简单起见,我将数据库文件放在/tmp目录下。有了iOS模拟器,这一切都很好,我还没有在真正的设备上测试过这段代码,你可以将数据库放在文档文件夹或类似的地方(但这还不是重点)

这里重要的是sqlite3中的以下查询:

[db1 executeStatements:@"ATTACH DATABASE '/tmp/tmp2.db' AS second_db"];
在数据库连接db1处,我们附加来自第二个数据库的数据库文件

在此连接之后,您可以在数据库连接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];

Sqlite3允许它将外部数据库附加到当前连接。 想象一下,您有两个数据库,每个数据库通过FMDatabase拥有自己的连接(为了多线程目的,您应该使用FMDatabaseQueue)。 现在,将另一个数据库连接到第一个数据库的连接。然后可以从数据库1连接到数据库2中的表。重要提示:所有这些都是通过sqlite per sql语句实现的,与FMDB无关

我将在github上提供示例代码:

为了简单起见,我将数据库文件放在/tmp目录下。有了iOS模拟器,这一切都很好,我还没有在真正的设备上测试过这段代码,你可以将数据库放在文档文件夹或类似的地方(但这还不是重点)

这里重要的是sqlite3中的以下查询:

[db1 executeStatements:@"ATTACH DATABASE '/tmp/tmp2.db' AS second_db"];
在数据库连接db1处,我们附加来自第二个数据库的数据库文件

在此连接之后,您可以在数据库连接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];