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

我的情况是这样的。 出于安全原因,我决定将应用程序数据放到包和用户数据文件目录中。 问题是如何从不同的数据库中join表格? 如果不可能的话,我必须创build一个表到文件目录中的数据库?

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

我将在github上提供示例代码: https : //github.com/itinance/MultiDatabaseJoin

为了简单起见,我把数据库文件放在/ tmp-directory下。 使用iOS-Simulator这个工作正常,我还没有在真正的设备上testing过这个代码,在那里你会把数据库放在文档文件夹或类似的东西(但那不是那个点)。

这里最重要的是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];