Как деятельность и служба могут одновременно записывать в БД?

У меня есть приложение с IntentService, которое запускается время от времени. Если оба они выполняются вместе, операторы SQL, которые записывают в базу данных, перекрывают друг друга (ошибка базы данных заблокирована) и приводят к сбою приложения.

Есть ли способ как для действия, так и для службы каким-то образом использовать одно и то же соединение с базой данных?


person kidalex    schedule 06.02.2011    source источник
comment
Используйте поставщика контента и убедитесь, что вы используете общий SQLiteDatabase. ContentProviders не потокобезопасны; вам нужно обеспечить блокировку (т.е. позволить SQLiteDatabase сделать это за вас).   -  person Christopher Orr    schedule 06.02.2011


Ответы (1)


  1. Как предлагает Фалмарри, вы можете использовать поставщика контента.

  2. Синхронизируйте доступ, используя стандартные параметры синхронизации потоков Java (например, ключевое слово java.util.concurrent, synchronized).

  3. Действие не должно производить запись в базу данных. Действие должно отправлять Intent в IntentService и оно записывает в базу данных.

person CommonsWare    schedule 06.02.2011
comment
Я полностью согласен. Вариант 3 также позволяет избежать тряски, когда ввод-вывод занимает некоторое время. Запись в NAND может занять много времени (например, 300 мс или около того), и за это время действие не будет реагировать на ввод данных пользователем. - person Kevin Read; 06.02.2011