Правильно открыть/закрыть базу данных с шаблоном проектирования Singleton
Я создаю приложение, которое делает много взаимодействий с базой данных (как операций чтения, так и записи).
Чтобы избежать операций открытия/закрытия при каждом запросе, я создал класс, расширяющий SQLiteOpenHelper
с шаблоном проектирования Singleton. Таким образом, я уверен, что только один экземпляр SQLiteOpenHelper
и только одно соединение с базой данных выполняется на протяжении всего жизненного цикла приложения (и не только жизненного цикла активности).
Я также читал некоторые статьи о ContentProvider, но я не уверен, что это лучший способ.
Итак, это основная логика моего класса Singleton (onCreate
и onUpgrade
удалена):
public final class BaseSQLite extends SQLiteOpenHelper {
private static BaseSQLite mInstance = null;
private SQLiteDatabase db = null;
public static BaseSQLite getInstance(Context context) {
if (mInstance == null) {
mInstance = new BaseSQLite(context.getApplicationContext(),
DBNAME, DBVERSION);
}
return mInstance;
}
private BaseSQLite(final Context context, final String name,
final int version) {
super(context, name, null, version);
db = getWritableDatabase();
}
@Override
public synchronized void close() {
if (mInstance != null)
db.close();
}
public Cursor getAllData() {
String buildSQL = "SELECT * FROM myTable";
return db.rawQuery(buildSQL, null);
}
}
Итак, чтобы получить доступ к моей базе данных, я сделал следующее:
BaseSQLite baseSQLite = BaseSQLite.getInstance(context);
baseSQLite.getAllData();
Теперь он отлично работает. Но мой вопрос касается метода close()
. Я действительно не знаю, когда позвонить. На самом деле, мой экземпляр базы данных одинаковый для каждой активации моего приложения, поэтому я считаю, что плохой идеей вызывать close()
в методе onPause(), потому что экземпляр будет потенциально (и это часто случается) воссоздан в onStart()
метода следующего действия. Кроме того, я не могу обнаружить end
моего приложения, то есть когда активность больше не видна на экране.
Может кто-нибудь помочь мне в этом вопросе? Я нашел некоторый ответ, когда база данных связана с активностью ONE, но для моего случая не существует никакого намека.
Ответы
Ответ 1
Вам следует позвонить в любое время, когда вы закончите запись в свою базу данных. Например, когда вы вставляете данные, у вас будет открытое соединение с базой данных, которое должно быть закрыто, когда это будет сделано.
Чтение отличается. Когда вы создаете базу данных SQLite на своем телефоне, данные сохраняются. База данных существует, и созданный вами обработчик обеспечивает удобный способ доступа к этой информации. Чтение базы данных обычно происходит путем получения читаемого экземпляра базы данных и использования Cursor
для извлечения значений. В этом случае вы закрываете курсор, когда вы закончите, а не саму базу.
Вы правы, что вы не должны закрывать соединение с базой данных в ходе жизненных циклов отдельных действий. Вместо этого, как было предложено выше, закройте соединение с базой данных в методах обработчика, которые записываются в базу данных, когда вы закончите выполнение этой транзакции.