Мы все узнаем , что такие ресурсы, как соединения с базой данных, должны быть получены поздно и выпущены рано.
Однако применение этого принципа к соединениям с базами данных SQLite на Android вызвало у меня головную боль.
У меня есть приложение, которое загружает обновления с внутреннего сервера в службу, работающую в фоновом режиме, регулярно записывает обновления в базу данных.Проблема, с которой я сталкиваюсь, возникает, когда возникает следующая последовательность:
- Служба открывает доступное для записи соединение с базой данных
- Некоторые действия открывают доступное для чтения соединение с базой данных
- Служба закрывает свое подключение к базе данных одновременно с данными чтения операции
- Сбой активности из-за того, что соединение с базой данных было закрыто
И служба, и операция используют одно и то же SQLiteOpenHelper
класс, хотя и разные экземпляры, для открытия своих соединений.Мое первоначальное предположение состояло в том, что это должно работать просто отлично, но почему-то кажется, что базовое соединение распределяется между двумя экземплярами базы данных.
Чтобы обойти проблему, я закончил , не закрывая объекты базы данных, закрывая только открытые курсоры.Кажется, это работает, хотя я не уверен, что у меня здесь нет утечки памяти.
Есть ли что-то очевидное, чего мне здесь не хватает?