DatabaseObjectNotClosedException - PullRequest
       4

DatabaseObjectNotClosedException

1 голос
/ 21 сентября 2011

Я заметил, что есть несколько вопросов по этому исключению.Но они не решают мою проблему.

У меня есть класс databaseHelper, который имеет внутренний класс, который расширяет SQLiteOpenHelper:

private static class OpenHelper extends SQLiteOpenHelper {
          OpenHelper(Context context) {
             super(context, DATABASE_NAME, null, DATABASE_VERSION);
          }

          @Override
          public void onCreate(SQLiteDatabase db) {
             db.execSQL("CREATE TABLE " + TABLE_NAME + "(id INTEGER PRIMARY KEY, name TEXT)");
          }
          @Override
          public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
             Log.w("DBHELPER", "Upgrading database");
             db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);

             onCreate(db);
          }


      }

У меня есть служба, которая постоянно обновляет базу данных.И действия, которые извлекают данные из базы данных.

И в службе, и в действиях, создаваемых dbHelper:

this.dh = new DatabaseHelper(this);

И я получаю исключение DatabaseObjectNotClosedException.Нужно ли закрыть DatabaseHelper?Как бы я это сделал?Или как мне решить эту проблему?

1 Ответ

3 голосов
/ 21 сентября 2011

Об этом нужно позаботиться за пределами вашего SQLiteOpenHelper.

Вам необходимо закрыть подключение к базе данных в любое время, когда ваша деятельность или служба приостановлена ​​/ остановлена.Если вы этого не сделаете, Android сгенерирует исключение, которое вы постоянно видите в LogCat.

Лучший способ для этого зависит от того, есть ли у вас глобальный или локальный объект БД.

Местное Используйте блок try catch finally.Откройте свою базу данных в попытке, а затем закройте ее окончательно.Таким образом, независимо от того, произошла ошибка или нет, ваша база данных закрыта.

OpenHelper dh = new DatabaseHelper(this);
SQLiteDatabase db = null;
try {
    db =  dh.getWritableDatabase();
} catch(SQLiteException e){

} finally {
    if(db != null && db.isOpen())
        db.close();
}

Global Используйте жизненный цикл Android для управления вашей базой данных.Откройте базу данных в onResume и закройте ее в onPause.

OpenHelper dh = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
    dh = new DatabaseHelper(this);
}

@Override
protected void onResume() {
    this.db =  dh.getWritableDatabase();
}

@Override
protected void onPause( {
    if(db != null && db.isOpen()){
        db.close();
    }
}

Что касается вашей проблемы Service.Читайте о Service Lifecycle .Вы можете использовать шаблон, который я реализовал в разделе Global .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...