2014-05-23 61 views
1

我在App中使用Sqlite作爲後端。我有一些混亂。我正在使用一個類使用Sqlite說「DatabaseManager」。在這個類中,我聲明瞭所有的方法(從DB訪問數據)都是靜態的。在多線程中,將所有方法設置爲靜態或「DatabaseManager」應該是單例類還是普通類都可以嗎?在多線程中使用SQLite的最佳方式Objective-C

我面對像一個線程的問題是使用後關閉數據庫,而其他線程(也訪問DB)中,然後應用程序崩潰之間有信息「超額壞」

我使用NSOperationQueue和的NSOperation的多線程而不是GCD。這樣我可以根據需要取消操作。

實際上,在App中有一些計算部分需要數據庫中的多個表中的數據。如果我在主線程中這樣做,它需要時間或表滾動變得光滑。

請引導我。

+0

嘗試微調關於FMDB可以幫助你解決這個問題。 –

+0

同時打開多個數據庫似乎是合理的,所以這個類應該既不是單例也不是靜態的。 – trojanfoe

+1

+1表示「光滑」。 – trojanfoe

回答

0

SQlite數據庫是線程安全的。 「線程安全」是指您可以同時在不同的線程中使用不同的SQLite數據庫連接。 在多個線程中同時使用相同的數據庫連接從未安全。

一個很好的解決方案的是測試SQLITE_BUSY

僞代碼來說明一個解決方案:

continueTrying = YES; 
while (continueTrying) 
{ 
    retval = sqlite_exec(db, sqlQuery, callback, 0, &msg); 
    switch (retval) 
{ 
     case SQLITE_BUSY: 
     Log("[%s] SQLITE_BUSY: sleeping for a while...", threadName); 
     sleep a bit... (use something like sleep(), for example) // -> usleep(20); 
     break; 
     case SQLITE_OK: 
     continueTrying = NO; // We're done 
     break; 
     default: 
     Log("[%s] Can't execute \"%s\": %s\n", threadName, sqlQuery, msg); 
     continueTrying = NO; 
     break; 
    } 
    } 


return retval; 

其他解決方案是使用串行隊列:

databaseQueue = dispatch_queue_create("com.company.app.yourdatabase", 0); 
dispatch_sync(databaseQueue, ^{ 
    // your database activity 
}); 
相關問題