DatabaseObjectNotClosedException

时间:2011-09-20 21:28:14

标签: android sqliteopenhelper

我注意到这个例外有几个问题。但他们没有解决我的问题。

我有一个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);
          }


      }

我有一个连续更新数据库的服务。以及从db。

获取数据的活动

在服务和活动中创建dbHelper:

this.dh = new DatabaseHelper(this);

我确实得到了DatabaseObjectNotClosedException。我需要关闭DatabaseHelper吗?我该怎么办?或者我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

这需要在SQLiteOpenHelper之外进行处理。

您需要在暂停/停止活动或服务时关闭数据库连接。如果你不这样做,Android会抛出你在LogCat中看到的异常。

最佳做法取决于您是否拥有全局或本地数据库对象。

本地
使用try catch finally块。在try中打开您的数据库,然后在最后关闭它。这样,无论是否有错误,您的数据库都会关闭。

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

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

<强>全球
利用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 部分中实现的模式。