从不同进程访问SQLite

从不同进程访问SQLite,sqlite,blackberry,Sqlite,Blackberry,我正在开发一个使用SQLite作为主要数据存储方法的应用程序。我有两个进程使用备用入口点运行我的应用程序 我需要从两个不同的进程访问同一个数据库,但我们现在都知道SQLite不像服务器数据库引擎,一次只能访问一次 我想知道是否有一种方法可以在其他进程访问数据库时“锁定”它,这样,如果第二个进程同时尝试访问数据库,它会等到第一个进程完成,然后再次尝试访问它 如何处理这个问题?如果您还没有,请创建一个类,将您的数据库访问抽象出来,并将其存储在RuntimeStore中。无论您在哪里与SQLite进行

我正在开发一个使用SQLite作为主要数据存储方法的应用程序。我有两个进程使用备用入口点运行我的应用程序

我需要从两个不同的进程访问同一个数据库,但我们现在都知道SQLite不像服务器数据库引擎,一次只能访问一次

我想知道是否有一种方法可以在其他进程访问数据库时“锁定”它,这样,如果第二个进程同时尝试访问数据库,它会等到第一个进程完成,然后再次尝试访问它


如何处理这个问题?

如果您还没有,请创建一个类,将您的数据库访问抽象出来,并将其存储在RuntimeStore中。无论您在哪里与SQLite进行接口,都可以使用存储该类的GUID(RuntimeStore.get(long))获取对该类的引用,并以正常方式同步该类(成员对象锁、同步方法)

不要只使用Wikipedia风格的单例模式,因为它不是这个平台上跨进程的真正单例模式

见:

样本:

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中提取出来。

如果您还没有,请创建一个将数据库访问抽象出来的类,并将其存储在RuntimeStore中。无论您在哪里与SQLite进行接口,都可以使用存储该类的GUID(RuntimeStore.get(long))获取对该类的引用,并以正常方式同步该类(成员对象锁、同步方法)

不要只使用Wikipedia风格的单例模式,因为它不是这个平台上跨进程的真正单例模式

见:

样本:

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中提取出来。

谢谢Doug!,我刚刚在维基上读了一篇关于单身人士的文章,这对我来说是一个新名词,但我想我现在不明白了。为什么这在黑莓手机上不起作用?这个特性在JavaME中不可用吗?我现在将阅读有关RuntimeStore的内容,因为我不熟悉它。如果您有一些代码示例,我将不胜感激,但我仍将阅读有关运行库的内容,非常感谢!顺便问一下,您是否使用过SQLITE_BUSY标志@Blackberry?我不确定这是否能解决问题。这是一个例子嘿,Doug,我读过关于RuntimeStore的文章,但是在这个例子中,我不太清楚我应该在RuntimeStore包装哪个对象。我创建了一个名为SQLManager的类,它处理所有DB事件(打开、插入、更新、创建等),我应该包装这个对象吗?我想我不理解RuntimeStore的概念,但是在这种情况下,它的实现不是很清楚,任何帮助都将不胜感激。提前感谢,我不知道Java ME的整体情况(快速搜索没有发现任何问题),但对于BlackBerry,单例实例仅在调用getInstance的过程中是唯一的,因此您会得到多个单例:)我没有使用SQLITE_BUSY标志,抱歉。从听起来,是的,您可以将SQLManager放在RuntimeStore中。我将用一个代码示例编辑我的答案。它只通过在RuntimeStore中存储一个布尔标志来指示DB文件是否正在使用,谢谢Doug!!谢谢你,道格!,我刚刚在维基上读了一篇关于单身人士的文章,这对我来说是一个新名词,但我想我现在不明白了。为什么这在黑莓手机上不起作用?这个特性在JavaME中不可用吗?我现在将阅读有关RuntimeStore的内容,因为我不熟悉它。如果您有一些代码示例,我将不胜感激,但我仍将阅读有关运行库的内容,非常感谢!顺便问一下,您是否使用过SQLITE_BUSY标志@Blackberry?我不确定这是否能解决问题。这是一个例子嘿,Doug,我读过关于RuntimeStore的文章,但是在这个例子中,我不太清楚我应该在RuntimeStore包装哪个对象。我创建了一个名为SQLManager的类,它处理所有DB事件(打开、插入、更新、创建等),我应该包装这个对象吗?我想我不理解RuntimeStore的概念,但是在这种情况下,它的实现不是很清楚,任何帮助都将不胜感激。提前感谢,我不知道Java ME的整体情况(快速搜索没有发现任何问题),但对于BlackBerry,单例实例仅在调用getInstance的过程中是唯一的,因此您会得到多个单例:)我没有使用SQLITE_BUSY标志,抱歉。从听起来,是的,您可以将SQLManager放在RuntimeStore中。我将用一个代码示例编辑我的答案。它只通过在RuntimeStore中存储一个布尔标志来指示DB文件是否正在使用,谢谢Doug!!