Доступ к SQLite из разных процессов - PullRequest
0 голосов
/ 11 августа 2010

Я разрабатываю приложение, которое использует SQLite в качестве основного метода хранения данных. У меня запущено два процесса для моего приложения с использованием альтернативной точки входа.

Мне нужно получить доступ к одной и той же БД из двух разных процессов, но, как мы все сейчас знаем, SQLite не похож на серверную базу данных, доступ к ней возможен только один раз за один раз.

Я хотел бы знать, есть ли способ «заблокировать» БД при обращении к ней другого процесса, чтобы, если второй процесс попытался получить доступ к БД одновременно, он бы дождался первого процесса заканчивается, а затем попробуйте получить к нему доступ снова.

Как можно решить эту проблему?

1 Ответ

4 голосов
/ 11 августа 2010

Если вы этого еще не сделали, создайте класс, который абстрагирует доступ к вашей базе данных, и сохраните его в 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, а затем извлекаете его из RuntimeStore - используя указанный GUID.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...