2011-12-14 116 views
1

我正在爲我的android應用程序使用SOA架構。我在後臺連續運行一項服務(每隔1分鐘),從我的MYSQL數據庫中提取數據並將其與我的SQLite數據庫(如果在2個數據庫中有任何更改)進行同步。SQlite:數據庫被鎖定錯誤

現在,當服務在後臺運行時,它會打開SQLite。同時,如果我正在處理(使用)應用程序,它也會嘗試打開Sqlite來獲取數據。在這種情況下,我得到一個錯誤,稱爲:數據庫鎖定在android.database.SQLiteOpenHelper.getReadableDatabase。

任何人都可以請建議我在這種情況下可以做些什麼?

+0

根據你的建議,我已經用這種方式創建了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

+0

現在這個GetObjectFromDB是一個來自DatabaseHelper的方法。這個方法從Sqlite數據庫讀取數據。爲此,我需要訪問數據庫,並以此方式執行此操作: \t SQLiteDatabase db = this.getReadableDatabase(); 如前所述,我的應用程序運行很多線程。當我的一個線程訪問數據庫時,另一個線程也嘗試使用相同的方法GetObjectFromDB訪問數據庫。 我的問題是,getReadableDatabase()總是打開一個新的數據庫連接。我怎樣才能克服這個問題。 謝謝,Neha – Neha

+0

大家好,我得到了我的問題的答案。我做了一個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

回答

1

您需要共享應用程序和後臺服務之間的單個數據庫連接。這將正確地序列化對數據庫的所有訪問。

+0

非常感謝:) – Neha

0

SQlite是一個基於文件的數據庫,一次只允許訪問一個應用程序。

  1. 你必須要麼使用你的應用程序同步服務,讓 的服務讓一些時間的應用程序來獲取新的數據(有 在這其中許多解決方案;尋找信號量,監視器和循環賽)。

  2. 你使用第二個服務,將獲得I/O的數據庫請求從 服務和應用,排隊它們,執行請求的I/O和 返回任何結果提交的應用程序或服務請求。

2

我更喜歡你在這裏使用ContentProvider

即使其主要目的是在應用程序之間共享,它可以在我們的單個應用程序內使用。

如果我們使用內容提供者,不用擔心db的關閉和鎖定問題。

參考Simple Content Provider for db operations

0

這是不正確的,SQLite的3對多個連接的支持,並且可能讓他們同時打開。只要確保在更新線程中使用事務並儘快關閉它即可。

閱讀有關這http://www.sqlite.org/lockingv3.html

是你使用python,你可以如當連接到數據庫時,設置timeout參數,這將確保讀者線程在放棄之前等待超時秒。因此,使更新程序儘可能緊湊是非常重要的,這樣讀者就不會超時。

http://docs.python.org/library/sqlite3.html

而且,我深深的,如果你想了解更多reccomend下面的書籍。SQLite權威指南:http://www.apress.com/9781590596739