我正在爲我的android應用程序使用SOA架構。我在後臺連續運行一項服務(每隔1分鐘),從我的MYSQL數據庫中提取數據並將其與我的SQLite數據庫(如果在2個數據庫中有任何更改)進行同步。SQlite:數據庫被鎖定錯誤
現在,當服務在後臺運行時,它會打開SQLite。同時,如果我正在處理(使用)應用程序,它也會嘗試打開Sqlite來獲取數據。在這種情況下,我得到一個錯誤,稱爲:數據庫鎖定在android.database.SQLiteOpenHelper.getReadableDatabase。
任何人都可以請建議我在這種情況下可以做些什麼?
根據你的建議,我已經用這種方式創建了DatabaseHelper(它是包裝類)的單個實例: private static DatabaseHelper instance; public static synchronized DatabaseHelper getHelper(Context context) if(instance == null) instance = new DatabaseHelper(context); return instance; } 現在,每當我需要使用DatabaseHelper的方法我稱他們爲follws: \t \t DatabaseHelper分貝= DatabaseHelper.getHelper(本); \t BaseObject bObj = db.GetObjectFromDB(「GlobalObject1」); – Neha
現在這個GetObjectFromDB是一個來自DatabaseHelper的方法。這個方法從Sqlite數據庫讀取數據。爲此,我需要訪問數據庫,並以此方式執行此操作: \t SQLiteDatabase db = this.getReadableDatabase(); 如前所述,我的應用程序運行很多線程。當我的一個線程訪問數據庫時,另一個線程也嘗試使用相同的方法GetObjectFromDB訪問數據庫。 我的問題是,getReadableDatabase()總是打開一個新的數據庫連接。我怎樣才能克服這個問題。 謝謝,Neha – Neha
大家好,我得到了我的問題的答案。我做了一個DataBasehelper(它是一個包裝類)的靜態實例和SQLiteDatabase的靜態實例:private static DatabaseHelper instance; private static SQLiteDatabase sqlitedb = null; public synchronized SQLiteDatabase getHelper() if(sqlitedb == null) sqlitedb = this.getWritableDatabase();如果(sqlitedb == null) sqlitedb = this.getWritableDatabase(); } else if(sqlitedb.isOpen()== false) sqlitedb = this.getWritableDatabase(); } return sqlitedb; }現在我按如下方式調用數據庫:SQLiteDatabase db = this.getHelper(); – Neha