2015-01-08 39 views
1

我正在使用iOS(obj-c)項目中的本地SQLITE數據庫,我們選擇使用FMDB。請注意我對更改爲Core Data或從FMDB切換到其他庫不感興趣。ios - 使用FMDB在後臺線程上執行數據庫操作

一切正常,但當我們第一次運行應用程序的數據從我們的服務器下載,json被解析,然後排序到本地數據庫。由於信息量大,需要30-40秒。理想情況下,這將在後臺完成,但FMDB不允許(至少據我所知),因爲它可能會導致db數據完整性的問題。

是否有人成功地使用FMDB庫在後臺線程上運行所有查詢,插入等操作?我試着簡單地包裹行動:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     // ... query/insert/update/delete 
    }); 

...但我最終分貝完整性問題。任何提示或例子都會很棒。提前致謝。

+0

只是好奇。你最終如何解決這個問題? – nawar

回答

2

@nawar - 對不起,不發佈這個更快。我最終在dispatch_async塊中使用了FMDatabaseQueue的單個實例(而不是FMDatabase)。奇蹟般有效。我遇到的問題是由於使用FMDatabase。

+1

我想你應該在這裏接受你自己的答案。 –

+0

你可以用你的答案發布一些代碼嗎?這對其他人(像我)會有同樣的問題。 – Suragch

+1

Hi @Suragch FMDatabaseQueue將按順序執行您所執行的任何操作(序列化)。所以只要你有一個FMDatabaseQueue實例處理所有對db的調用,你就可以在dispatch_async塊中執行這些調用。我們最終使用單例類「UserDatabase」來完成它:在初始化此類時實例化隊列,並將所有操作包裝在dispatch_async中。被警告我沒有爲所有功能做這個,所以我不能擔保。我們在第一次啓動時只使用這個函數來獲取大量的初始行到db中。其他一切都是同步完成的。 – Warblr

0

dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
 
     [self.dbQueue inTransaction:^(FMDatabase *db, BOOL *rollback) { 
 
      BOOL result = YES; 
 
      for (int i = 500; i < 1000; i++) { 
 
       result = [db executeUpdate:@"insert into testTable (name) values(?)",[NSString stringWithFormat:@"name-%d",i]]; 
 
       if (!result) { 
 
        NSLog(@"break"); 
 
        *rollback = YES; 
 
        break; 
 
       } 
 
      } 
 
       
 
     }]; 
 
    });

相關問題