SQLiteDatabaseLockedException

錯誤日誌:

android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5): , while compiling: PRAGMA journal_mode
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
at com.ivcar.weibo.support.database.FriendsTimeLineDBTask.getWsd(FriendsTimeLineDBTask.java:50)

遇到這個問題,有以兩種可能:
(1)多線程訪問造成的數據庫鎖定。
如A線程在訪問當前的數據庫,這時候B線程也需要訪問數據庫,這樣在B線程中,就會有類似以上的異常產生,我們需要將提供數據庫訪問的方法設置成同步的,防止異步調用時出現問題,如在調用方法中增加 synchronized 修飾符。
使用synchronized 關鍵字來修飾獲取數據庫連接的方法,或者使用isDbLockedByOtherThreads方法判斷數據庫是否被鎖住了,然後等待一定的時間再進行訪問。
參考:http://bbs.9ria.com/thread-247178-1-1.html
(2)執行事務操作未正常關閉。
如下面代碼,使用事務操作數據庫,但事務執行完成後未調用db.endTransaction();關閉事務。
//獲取行業列表

public ArrayList GetIndustryList(){

ArrayList IndustryList=new ArrayList();

SQLiteDatabase db=openDatabase();

db.beginTransaction();

Cursor cursor = db.rawQuery(

"select * from dcIndustry",

null);

while(cursor.moveToNext()){

IndustryList.add(new Industry(cursor.getString(0),cursor.getString(1)));

}

db.close();

return IndustryList;

}

Android 4.0以前的版本db.close();會結束事務,而Jelly Bean 以後的版本因爲安全性的問題,必須結束即endTransactiony以後才能再次訪問本地數據庫。
(3)sqlite自身的問題
有時我們會在調試程序的時候發現Log控制檯頻繁的出現上述異常,而在運行程序的時候就沒有這個問題,這種現象我在調試ResultSet時也會出現,查資料找原因是因爲sqlite數據不完全是線程安全的,導致在一些地方會莫名其妙的出問題,如果遇到這樣的情況,那隻能不要將斷點打到數據庫連接的地方了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章