2010-08-11 31 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