2010-08-31 16 views
11

android上的sqlite允許您從多個procs訪問數據庫進行讀取,但是如果您當前正在從一個進程寫入,則其他procs的讀取和寫入操作將引發異常,因爲第一次寫入有鎖在分貝。Android sqlite併發性無例外

「特效」我的意思是在同一個應用程序中的其他線程。

是否有一種標準的方式讓其他線程等待數據庫再次可用,可能是指定的超時而不是拋出異常?

預計「你爲什麼這樣做?」答案,它就是我們這樣做的方式,就是這樣。我們也不會使用內容提供商。只需要一種方法來同步數據庫訪問。

假設沒有標準的方法來做到這一點,我們可能會結束編寫db調用的包裝來做一些線程同步。

回答

17

只要您使用相同的SQLiteDatabase對象,就可以爲您完成同步。

所以如果你通過單例訪問對象,應該沒有問題。儘管如果你想實現一個超時,你可能想添加一些更多的邏輯,例如等待/通知或類似的東西。

+0

所以,你是說使用1 SQLiteOpenHelper,然後1您的整個應用程序的可寫連接?所有活動和服務? – 2010-08-31 16:36:50

+4

我沒有足夠的「影響力」來讚揚這個答案,但它確實使我走上了正確答案的道路。無論您調用「getReadable ...」還是「getWritable ...」,SQLiteOpenHelper實際上都會返回相同的緩存對象,那麼數據庫對象本身具有一個Java Lock對象,以確保任何調用讀取或寫入都被序列化。我將不得不保留一個單身SQLiteOpenHelper,它會讓我定期「關閉」db對象,這看起來「更安全」。 Sqlite本身可以處理多個讀取客戶端,這在邏輯上似乎表現更好,但無論如何。 再次感謝。 – 2010-08-31 20:04:10

+0

@kāgii作爲提問者,你可以接受這個答案,或者寫下你自己的答案並接受 – ohhorob 2010-09-10 22:29:29

2

或者您可以使用其他支持它的數據庫,如H2。我知道這可能聽起來像一個奇怪的想法。但根據我的初步測試,它的效果很好(在模擬器和設備上),實際上並不慢。除了打開和關閉數據庫(目前非常慢),大約1秒鐘,但有其他原因,並希望在下一個版本中得到解決。