2010-08-11 35 views
0

我正在開發一個使用SQLite作爲主數據存儲方法的應用程序。我有兩個進程爲使用備用入口點的應用程序運行。從不同進程訪問SQLite

我需要從兩個不同的進程訪問相同的數據庫,但現在我們都知道SQLite不像服務器數據庫引擎,它一次只能訪問一次。

我想知道是否有某種方法可以在數據庫被其他進程訪問時「鎖定」數據庫,以便如果第二個進程試圖同時訪問數據庫,它會一直等到第一個進程過程完成,然後嘗試再次訪問它。

如何處理這個問題?

回答

4

如果您尚未創建一個將您的數據庫訪問抽象出來並將其存儲在RuntimeStore中的類。無論您要與SQLite進行接口,使用您存儲的GUID(RuntimeStore.get(long))獲取對該類的引用,並通過同步類(通常是成員對象鎖,同步方法)來同步類。

不要只使用維基百科風格的單例模式,因爲它不是跨平臺的流程中的真正單身人士。

參見:

http://www.blackberry.com/developers/docs/5.0.0api/net/rim/device/api/system/RuntimeStore.html

樣品:

class SQLManager { 
    private static long GUID = 0xa178d3ce564cae69L; // hash of com.stackoverflow.SQLManager 

    private SQLManager() { 
     // ctor stuff here 
    } 

    public static SQLManager getInstance() { 
     RuntimeStore rs = RuntimeStore.getRuntimeStore(); 

     SQLManager instance = rs.get(GUID); 

     if (instance == null) { 
      instance = new SQLManager(); 
      rs.put(GUID, instance); 
     } 

     return instance; 
    } 
} 

你還在使用單 「模式」 本身,而是要存儲的對象實例在RuntimeStore上第一getInstance調用,然後使用您指定的GUID將其從RuntimeStore中拉出。

+0

感謝Doug !,我剛剛在Wiki上看了一篇關於單身人士的文章,對我來說是一個新詞,但我認爲我現在不喜歡它。爲什麼這在黑莓手機上不起作用?此功能在Java ME中不可用嗎? 因爲我不熟悉它,所以我現在將閱讀有關RuntimeStore的內容。我會很感激,如果你有一些代碼示例,但我仍然會閱讀有關運行時間商店 非常感謝! – Arturo 2010-08-13 20:55:42

+0

順便說一下,你使用了SQLITE_BUSY標誌@黑莓手機嗎?我不確定這是否可以成爲解決方案。這裏是一個例子 http://stackoverflow.com/questions/2775595/sqlite-multi-process-access – Arturo 2010-08-13 20:57:06

+0

嘿道格,我讀了關於RuntimeStore,但它不是很清楚,在這種情況下,這是我應該包裝的objet在RuntimeStore。我創建了一個名爲SQLManager的類來處理所有的數據庫事件(打開,插入,更新,創建等),我應該包裝這個對象嗎?我認爲我不喜歡RuntimeStore的概念,但在這種情況下實現並不是很清晰。 = /,任何幫助將非常感激。在此先感謝 – Arturo 2010-08-13 21:01:29