Обработка баз данных двумя процессами
У меня есть приложение с двумя частями.
- Служба, которая создает контент.
- Приложение, использующее контент
Каждый из них работает как разные процессы. Проблема в том, что обе они совместно используют базу данных. И я часто получаю ошибку с блокировкой базы данных, как когда служба пытается что-то написать, так и пользовательский интерфейс считывает данные. И наоборот.
Как это сделать?
- Класс, используемый для доступа к БД, представляет собой одноэлементный класс. Но поскольку оба пользовательских интерфейса и службы являются двумя разными процессами, я полагаю, что есть два синглета. Так что это не помогает.
- Даже
synchronise
не поможет, я полагаю, потому что снова из-за двух разных процессов.
-
Content Providers
может быть вариант, но поскольку я использую сложные запросы для копания информации, было бы очень сложно использовать это.
Как получить два процесса, совместно использующих базу данных.
Любые реплики были бы оценены.
Ответы
Ответ 1
Использование поставщика контента - это один из вариантов. Другой - взглянуть на Berkeley DB. BDB SQL API совместим с SQLite, а диспетчер блокировки BDB позволяет одновременно обрабатывать и записывать несколько потоков и/или процессов в базу данных.
Ответ 2
закрыть соединение после каждой операции
уловить ошибку блокировки базы данных и попытаться снова подключиться через 50 мс
или позвольте службе обрабатывать базу данных, а активность запрашивает службу для данных
может быть isDatabaseInUseMethod?
Ответ 3
Вы должны использовать контент-провайдера для вовлечения ваших запросов к базе данных через один источник. Внутри поставщика контента вы можете использовать любые механизмы блокировки, которые вы хотели бы обеспечить, чтобы у вас не было одновременного доступа. Вы также можете подумать об использовании наблюдателей контента для координации действий службы с изменениями в базе данных.
Ответ 4
Следующее - отличная статья о том, как блокировка работает с SQLite на Android и о чем нужно знать: http://kagii.squarespace.com/journal/2010/9/10/android-sqlite-locking.html
Я думаю, вы найдете там несколько ответов:)