2011-03-09 40 views
22

我有一個包含2個部分的應用程序。使用2個進程進行數據庫處理

  • 創建內容的服務。
  • 使用內容

每個這些運行爲不同的過程中的應用。問題是它們都共享一個數據庫。而且,當服務嘗試寫入內容並且UI正在讀取數據時,我經常會遇到數據庫鎖定錯誤。反之亦然。 這個怎麼辦?

  • 用於訪問數據庫的類是單例類。但由於這兩個UI &服務是2個不同的進程,所以我假設有2個單例。所以這沒有幫助。
  • 即使synchronise不會幫助我想,因爲再次因爲2個不同的過程。
  • Content Providers也許是一種選擇,但由於我使用複雜的查詢來挖掘信息,因此也很難使用它。

如何讓兩個進程共享數據庫。 任何線索將不勝感激。

+0

可以指導我如何使用berkeley db。 – Kishore 2012-05-18 03:38:58

回答

7

使用內容提供者是一種選擇。另一種是看看Berkeley DB。 BDB SQL API與SQLite兼容,BDB鎖定管理器允許多個線程和/或進程同時讀取/寫入數據庫。

+0

聽起來很有趣。我一直在挖這方面的一些信息。有兩個選項BDB和BDB SQL,我顯然對後者感興趣。但看起來我們需要構建源代碼並刷新SQL版本的ROM? – Codevalley 2011-03-14 10:34:50

+0

OTN論壇是一個開始的好地方:http://bit.ly/eIREhr是的,我相信您需要構建源代碼。我已請求某人在OTN論壇上跟進您的問題。 – dsegleau 2011-03-15 16:05:25

+0

這個鏈接也是一個很好的開始:http://bit.ly/hb7wlC – dsegleau 2011-03-15 16:10:27

3

關閉連接每個操作

抓數據庫鎖定錯誤後嘗試之後50ms的

重新連接或讓服務處理數據庫和活動要求的服務,爲數據

可能有isDatabaseInUseMethod?

+0

嗯,我的確知道沒有'isDatabaseInUse'或類似的東西。由於服務和活動是不同的過程,它們之間的過程調用並不容易。 – Codevalley 2011-03-10 04:53:52

+3

是的,但你仍然可以捕捉異常並重複查詢。圍繞它做一個while語句,一旦其他進程關閉它的連接,它就會被執行。在兩者中做同樣的事情,他們將切換連接 – sherif 2011-03-10 09:21:32

+0

-1。這裏有很多錯誤。這本質上是試圖忽略像互斥體這樣的東西被髮明來解決的問題。不能保證一個流程會以任何合理的速度放行,例外情況應該是......例外,而不是規則,並且投票是一般應避免的事情。請做一些實際解決方案的研究。 – NargothBond 2017-12-19 23:45:54

1

您應該使用內容提供程序通過一個來源彙集數據庫查詢。在內容提供者的內部,你可以使用任何你想確保你沒有併發訪問的鎖定機制。您也可以考慮使用內容觀察器來協調服務操作和數據庫更改。

+0

我確實在挖掘這些線條。無法在「ContentProviders」上獲得一個示例應用程序。另外,我們可以在沒有ContentObservers的情況下使用它嗎? – Codevalley 2011-03-10 04:52:11

+0

是的,您可以在沒有contentobservers的情況下使用它。觀察者只是處理通知變化,但你必須手動觸發它們,所以你可以忽略它們,如果你不想。 – 2011-03-10 17:01:33