2011-11-17 77 views
1

我的Sqlite數據庫是從我的代碼中的各種線程訪問的,因此我得到了很多數據庫鎖問題。iOS中的sqlite鎖問題

爲了解決鎖定問題,我只在主線程中查詢數據庫。這樣做的缺點是如果有很多查詢需要執行,我的主線程就很忙。

我想寫一個機制,其中所有的DB調用都是從一個地方(在一個輔助線程中)執行的,以便它可以同步並且調用者可以從任何線程調用。

它可能就像任何模塊想要執行一個查詢,它將從主DB同步類檢查數據庫是忙還是空閒來執行任務。

注意: - 在我當前的實現中,我每次打開和關閉數據庫,每次我想執行查詢。它會對性能產生什麼影響?

任何提示正確的方向將不勝感激。

回答

2

重新打開數據庫當然比保持打開時間要花費更多的時間。但是,這可能不是很明顯的時間。

我建議你創建一個Grand Central Dispatch queue並將其用於所有數據庫訪問。這裏是你如何創建它:

// The queue needs to be a global variable, or globally accessible in some way. 
dispatch_queue_t dbQueue; 
// Make your sqlite3 connection global too. 
sqlite3 *dbConnection; 

// In your application delegate: 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // usual initialization ... 
    ... 
    int rc = sqlite3_open(dbFilename, &dbConnection); 
    if (rc != SQLITE_OK) 
     handleDbError(rc, dbConnection); 
    dbQueue = dispatch_queue_create("dbQueue", DISPATCH_QUEUE_SERIAL); 
    ... 
} 

這裏是你如何使用它:

dispatch_queue_async(dbQueue, ^{ 
    // This block runs off the main thread, and does not run simultaneously 
    // with any other blocks submitted to `dbQueue`. 
    NSString *result = executeDatabaseQuery(); 

    dispatch_queue_async(dispatch_get_main_queue(), ^{ 
     // This block runs on the main thread. 
     [(MyAppDelegate *)[UIApplication delegate] presentResult:result]; 
    }); 
}); 
+0

如果我有需要的不僅僅是我可以直接返回值返回值某些功能或者我需要實現一些功能爲了得到結果,你可以提到一些叫做presentResult的東西。感謝您的快速回復。 – Ekra

+0

你需要實現像presentResult這樣的函數。 –

+0

你好我喜歡你的答案,但我想問。當數據庫應該關閉? – Streetboy