0


私が構築している PoC Android アプリではandroid.database.sqlite.DatabaseObjectNotClosedException、アプリの終了時にガベージ コレクターが呼び出されたときにエラーが発生します。SQLiteDatabaseこれは、使用している とSQLiteOpenHelperオブジェクトの両方で close メソッドを呼び出している場合でも発生します。

コンストラクターでDBを開くためのコードを保持するDAO(から呼び出される)を使用してDBにアクセスしてAsyncTask.doInBackgroundいます。ActivityこのコンストラクターはonCreate()アクティビティのメソッドから呼び出されます。

//Code in my DAO class
public MyDataSource(Context context) {
    dbHelper = new MyOpenHelper(context);
    dbHelper.createDatabase();
}

//Calling Activity
MyDataSource myDs;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.create);

    myDs= new MyDataSource (MyActivity.this);
}

@Override
public void onPause() {
    investmentDs.close();
    if(ConstantValues.DebugModeManager.DEBUG_CREATE || ConstantValues.DebugModeManager.DEBUG_MODE) {
        Log.d(LOG_TAG, "Create screen paused...");
    }
    super.onPause();
}

同じアクティビティのメソッドから呼び出されるSQLiteDatabase、オブジェクトと同様に閉じるためのメソッドもあります。データベースの読み取り/書き込みは、AsyncTask のメソッドで実行されます。SQLiteOpenHelperonPause()doInBackground

close()のようにメソッドをオーバーライドしました。SQLiteOpenHelper

@Override
public synchronized void close() {
        if(database != null)
            database.close();
        super.close(); 
}

close()これをDAO クラスのメソッドから呼び出しています。

さらに説明が必要な場合はお知らせください。
ありがとう、
デボジット

編集 1:
これは、db から取得するためのコードです。

    cursor = db.query("EMPLOYEES", null, whereClause, null, null, null, "EMPLOYEE_ID");
    cursor.moveToFirst();

    List<MyBean> beans = new ArrayList<MyBean>();
    while(!cursor.isAfterLast()) {
        beans.add(cursorToObject(cursor)); //this fetches data from the cursor's current row            
        cursor.moveToNext(); // and inserts into a POJO of type MyBean

    }
    cursor.close();
4

1 に答える 1

0

カーソル オブジェクトが閉じられていません。Cursor オブジェクトを使い終わったら、cursor.close();を呼び出します。

于 2012-05-15T05:47:23.947 に答える