1

この例外についていくつかの質問があることに気付きました。しかし、彼らは私の問題を解決しません。

SQLiteOpenHelper を拡張する内部クラスを持つ databaseHelper クラスがあります。

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

アクティビティまたはサービスが一時停止/停止するたびに、データベース接続を閉じる必要があります。これを行わないと、LogCat に表示され続ける例外が Android によってスローされます。

これのベスト プラクティスは、DB オブジェクトがグローバルかローカルかによって異なります。

ローカル
ブロック を使用し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問題について。Service Lifecycleを読んでください。そこのグローバルセクションで実装したパターンを使用できます。

于 2011-09-20T21:42:22.100 に答える