Закрытие базы данных SQLite в одном потоке разрывает базу данных, открытую в другом потоке - PullRequest
3 голосов
/ 10 февраля 2011

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

Однако применение этого принципа к соединениям с базами данных SQLite на Android вызвало у меня головную боль.

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

  1. Служба открывает доступное для записи соединение с базой данных
  2. Некоторые действия открывают доступное для чтения соединение с базой данных
  3. Служба закрывает свое подключение к базе данных одновременно с данными чтения операции
  4. Сбой активности из-за того, что соединение с базой данных было закрыто

И служба, и операция используют одно и то же SQLiteOpenHelper класс, хотя и разные экземпляры, для открытия своих соединений.Мое первоначальное предположение состояло в том, что это должно работать просто отлично, но почему-то кажется, что базовое соединение распределяется между двумя экземплярами базы данных.

Чтобы обойти проблему, я закончил , не закрывая объекты базы данных, закрывая только открытые курсоры.Кажется, это работает, хотя я не уверен, что у меня здесь нет утечки памяти.

Есть ли что-то очевидное, чего мне здесь не хватает?

1 Ответ

1 голос
/ 11 февраля 2011

Есть ли что-то очевидное, чего мне здесь не хватает?

Я бы сказал нет. Глядя на исходный код SQLiteOpenHelper, я не вижу, как два экземпляра могут совместно использовать объект SQLiteDatabase.

Некоторые диагностические рекомендации:

  • Дамп значения toString() каждого SQLiteDatabase, который должен дать вам идентификатор экземпляра Java. Если они одинаковы, то в этом и заключается ваша проблема, и вам нужно будет пройти путь вверх по течению, чтобы выяснить, как, черт возьми, это происходит (например, вы действительно используете один и тот же экземпляр SQLiteOpenHelper).
  • Когда ваша база данных находится в стабильном состоянии (т. Е. Нет необходимости создавать или обновлять), переключите одну из двух точек базы данных, чтобы использовать SQLiteDatabase напрямую, а не через SQLiteOpenHelper, и посмотрите, имеет ли это значение. 1019 *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...