Ответ 1
Жирный шрифт в цитате соответствует этой части вашего кода:
private DatabaseManager open() throws SQLException {
dbHelper = new DatabaseHelper(context);
db = dbHelper.getWritableDatabase();
from: http://www.androiddesignpatterns.com/2012/05/correctly-managing-your-sqlite-database.html
Подход № 1: используйте абстрактный Factory для создания SQLiteOpenHelper
Объявите свой помощник базы данных как статическую переменную экземпляра и используйте Абстрактный шаблон Factory, чтобы гарантировать свойство singleton. пример кода ниже должен дать вам хорошую идею о том, как идти правильно спроектировав класс DatabaseHelper.
Статический метод getInstance Factory гарантирует, что только один DatabaseHelper когда-либо будет существовать в любой момент времени. Если mInstance объект не был инициализирован, один будет создан. Если уже был создан, тогда он будет просто возвращен.
Вы должны не инициализируйте свой вспомогательный объект с помощьюnew DatabaseHelper(context)
.
Вместо этого всегда используйтеDatabaseHelper.getInstance(context)
, поскольку это гарантирует, что только один помощник базы данных будет существовать во всем жизненном цикле приложения.
public static class DatabaseHelper extends SQLiteOpenHelper {
private static DatabaseHelper mInstance = null;
private static final String DATABASE_NAME = "database_name";
private static final String DATABASE_TABLE = "table_name";
private static final int DATABASE_VERSION = 1;
public static DatabaseHelper getInstance(Context ctx) {
// Use the application context, which will ensure that you
// don't accidentally leak an Activity context.
// See this article for more information: http://bit.ly/6LRzfx
if (mInstance == null) {
mInstance = new DatabaseHelper(ctx.getApplicationContext());
}
return mInstance;
}
/**
* Constructor should be private to prevent direct instantiation.
* make call to static factory method "getInstance()" instead.
*/
private DatabaseHelper(Context ctx) {
super(ctx, DATABASE_NAME, null, DATABASE_VERSION);
}
}