Я прочитал несколько «ответов», но не смог найти окончательного ответа.Когда закрыть базу данных в Android
У меня есть приложение, выполняющее операции DB с использованием AsyncTask, поэтому оно может выполняться в любом из потоков в пуле. У меня также есть фоновый поток для синхронизации данных (длительная работа)
Какую модель использовать?
Раскладка 1: Открытие и закрытие для каждой операции, пример:
db = SQLiteOpenHelper.getWriteableDatabase()
// Do some operations such as insert/select ...
db.close();
шаблон 2: Открыть один раз в запуске приложения, обмен между всеми нитями и близко при завершении приложения, пример:
Application:
public void onCreate(){ .. open database and cache the instance ... }
Шаблон 3: Внедрение некоторой формы подсчета ссылок для обнаружения, когда выпущены все ссылки на кешированный экземпляр. (Я думал, что Android уже реализовал это изначально, но я ошибся)
Я видел код для SQLiteOpenHelper.getWriteableDatabase()
, он возвращает тот же экземпляр, если он не закрыт. Таким образом, для шаблона 1, 2 потока могут получить один и тот же экземпляр, и один поток может закрывать экземпляр, когда другой поток выполняет операцию. Это приводит к тому, что в моем приложении «процедура библиотеки выполняется из последовательности». Узор 1 также кажется излишним для открытия и закрытия нескольких раз.
Образец 2 кажется более безопасным, но как определить, когда приложение завершается? Кажется, что нет надежного способа. Что происходит, когда база данных не закрывается, когда приложение завершается?