我正在开发一个使用SQLite作为主要数据存储方法的应用程序。我使用备用入口点为我的应用程序运行了两个进程。
我需要从两个不同的进程访问相同的数据库,但是现在我们所有的SQLite都不像服务器数据库引擎,它一次只能被访问一次。
我想知道当数据库被其他进程访问时是否有一种“锁定”数据库的方法,这样如果第二个进程同时尝试访问数据库,它将等到第一个进程完成后再尝试再次访问它。
如何处理这个问题?
答案 0 :(得分:4)
如果还没有,请创建一个抽象数据库访问的类,并将其存储在RuntimeStore中。无论您要在哪里与SQLite接口,都可以使用存储它的GUID(RuntimeStore.get(long))获取对该类的引用,并按照您通常的方式同步该类(成员对象锁定,同步方法)。 p>
不要只使用维基百科样式的单例模式,因为它不是这个平台上各个进程的真正单例。
请参阅:
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;
}
}
您仍在使用单例“模式”本身,但是您在第一次getInstance调用时将对象实例存储在RuntimeStore中,然后使用您指定的GUID将其从RuntimeStore中拉出来。