2011-08-05 43 views
3

在我的應用程序中,一項服務是從服務器獲取數據並將其插入到table AHTC Desire中的數據庫鎖問題

如果我去特定的用戶界面,我需要列出來自另一個table B的數據,如果背景 操作正在進行,它會產生數據庫鎖定異常。我在兩個不同的表上並行完成了兩個數據庫 的操作。

它在三星gt15801工作正常。但HTC希望它會產生數據庫鎖定 錯誤。

HTC渴望 - 插入過程需要91秒。

三星gt15801 - 插入過程需要21秒。

+0

使用[此](http://notes.theorbis.net/2010/02/batch-insert-to-sqlite-on-android.html)方法花費較少的時間用於插入現在只需要3秒而不是91秒 – DroidBot

回答

14

嘗試使用一個SqliteDatabaseHelper並使其單個實例。之後在完成操作後,請不要關閉SqliteDatabase實例。

您可以實現對數據庫中該鎖看到這個

http://www.sqlite.org/lockingv3.html

當您啓動其中有許多併發操作,那麼你必須使用

database.beginTransaction(); /* for start transaction */ 

數據庫操作和完成操作之後數據庫可以使用

database.setTransactionSuccessful();  
database.endTransaction(); 

但是,如果您在交易之間發生錯誤,請勿設置database.setTransactionSuccessful();,以便事務將回滾。

您也可以檢查在錯誤的時間是否當前數據庫中的交易或不database.inTransaction();如果那麼你在交易的其他人你是不是在交易返回true

你也可以檢查是否目前數據庫已鎖定或無法通過調用

database.isDbLockedByCurrentThread(); 
database.isDbLockedByOtherThreads(); 

這將返回布爾。

你也可以設置你是否想鎖定你的數據庫,如果多個線程試圖讀取並在同一時間

database.setLockingEnabled(boolean); 

寫你的數據庫上面刪除的方法已過時,所以請不要使用。

+0

感謝您的答覆。如果我想做數據庫併發操作,那麼我需要做LOCK嗎?謝謝。 – DroidBot

+0

是的,你是對的 – Dharmendra

+1

不要使用'isDbLockedByOtherThreads()',因爲它總是返回false。不再有數據庫鎖定的概念。http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#isDbLockedByOtherThreads() –

相關問題