1

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

我有一个 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 吗?我该怎么做?或者我该如何解决这个问题?

4

1 回答 1

3

这是需要在您的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();
}

全球
利用 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问题。阅读服务生命周期。您可以使用我在Global部分中实现的模式。

于 2011-09-20T21:42:22.100 回答