在我的應用程序中,一項服務是從服務器獲取數據並將其插入到table A
。HTC Desire中的數據庫鎖問題
如果我去特定的用戶界面,我需要列出來自另一個table B
的數據,如果背景 操作正在進行,它會產生數據庫鎖定異常。我在兩個不同的表上並行完成了兩個數據庫 的操作。
它在三星gt15801工作正常。但HTC希望它會產生數據庫鎖定 錯誤。
HTC渴望 - 插入過程需要91秒。
三星gt15801 - 插入過程需要21秒。
在我的應用程序中,一項服務是從服務器獲取數據並將其插入到table A
。HTC Desire中的數據庫鎖問題
如果我去特定的用戶界面,我需要列出來自另一個table B
的數據,如果背景 操作正在進行,它會產生數據庫鎖定異常。我在兩個不同的表上並行完成了兩個數據庫 的操作。
它在三星gt15801工作正常。但HTC希望它會產生數據庫鎖定 錯誤。
HTC渴望 - 插入過程需要91秒。
三星gt15801 - 插入過程需要21秒。
嘗試使用一個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);
寫你的數據庫上面刪除的方法已過時,所以請不要使用。
感謝您的答覆。如果我想做數據庫併發操作,那麼我需要做LOCK嗎?謝謝。 – DroidBot
是的,你是對的 – Dharmendra
不要使用'isDbLockedByOtherThreads()',因爲它總是返回false。不再有數據庫鎖定的概念。http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#isDbLockedByOtherThreads() –
使用[此](http://notes.theorbis.net/2010/02/batch-insert-to-sqlite-on-android.html)方法花費較少的時間用於插入現在只需要3秒而不是91秒 – DroidBot