Я создаю приложение, которое делает много взаимодействий с базой данных (как операций чтения, так и записи).
Чтобы избежать операций открытия/закрытия при каждом запросе, я создал класс, расширяющий 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, но для моего случая не существует никакого намека.