簡體   English   中英

如何在iOS應用中聯接來自FMDB中兩個不同數據庫的兩個表

[英]How to join two tables from two different databases in FMDB in a iOS app

我的情況就是這樣。 出於安全原因,我決定將應用程序數據放入包中,將用戶數據放入文檔目錄中。 問題是如何從不同的數據庫聯接表? 如果不可能,是否必須在文檔目錄中創建數據庫的表?

Sqlite3允許將外部數據庫附加到當前連接。 想象一下,您有兩個數據庫,每個數據庫都通過FMDatabase擁有自己的連接(出於多線程目的,應改用FMDatabaseQueue)。 現在,將另一個數據庫附加到第一個數據庫的連接上。 然后,您可以從數據庫1連接到數據庫2中的表。重要提示:所有這些操作都是通過sqlite per sql語句進行的,與FMDB無關。

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

為簡單起見,我將數據庫文件放在/ tmp-directory下。 使用iOS-Simulator可以很好地工作,我還沒有在真正的設備中測試過此代碼,您無法在其中將數據庫放置在document文件夾或類似的文件中(但這還不是重點)。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM