0

Cursor オブジェクトで .close() を呼び出すと、Activity の残りの期間は使用できないということですか? 以下は、私の Manager オブジェクト内のメソッドです。

Cursor cursor = null;

try {
    SQLiteDatabase db = openDb();
    cursor = db.query("table", null, "id=?", new String[] { id }, null, null, null);

    cursor.moveToFirst();
    long dateTime = cursor.getLong(1);

    cursor.close();
    return dateTime ;
} catch (CursorIndexOutOfBoundsException e) {
    return -1;
} finally {
    if (cursor != null) {
        cursor.close();
    }
    closeDb();
}

これは、IllegalStateException をスローしているメソッドです。ただし、少しひねりがあります。2 回目に呼び出されたときにのみエラーがスローされます。スタックトレースをトレースすると、問題を引き起こしている行は次のとおりです。

Cursor cursor = db.query("table", null, "id=?", new String[] { id }, null, null, null);

少しわかりやすくするために、このメソッドは、特定の ListView アイテムをクリックすることで、Activity の有効期間内に数回呼び出すことができます。openDb() および closeDb() メソッドは次のとおりです。

public SQLiteDatabase openDb() {
    if (mDbHelper == null) {
        mDbHelper = new DatabaseHelper(mContext);
    }
    return mDbHelper.getWritableDatabase();
}

public void closeDb() {
    mDbHelper.close();
}

そして、これらは Manager オブジェクトのスーパークラスに格納されます。mDbHelper は静的オブジェクトです。

Android プログラミングにかなり慣れていないので、なぜこれが例外をスローするのか疑問に思っています。私が考えることができる唯一の論理的な説明は、Cursor オブジェクトは実際には再利用されており、アクティビティの期間中に閉じてはならないということです。私は正しいですか?もしそうなら、いつ実際にカーソルを閉じますか?

- -編集 - -

コードを少しいじってみると、例外がはるかに不規則にスローされているようです。奇妙な理由で、ランダムに発生するようです。8 つの複数の ListView アイテムを問題なくクリックでき、突然バム! 9 番目は、アプリケーションをクラッシュさせます。

ListView をクリックすると、同じテーブルを更新するメソッドも呼び出されるため (これまでのところ問題はありませんでした)、それも含めることが重要だと思います。

try {
    SQLiteDatabase db = openDb();

    ContentValues cv = new ContentValues();
    cv.put("id", id);
    cv.put("dateTime", dateTime);
    long affected = db.replace("table", null, cv);

    return affected;
} finally {
    closeDb();
}

ご覧のとおり、ここではロケット科学は関与していません。ただし、このメソッドは同様の例外をスローし始めており、次の行で発生しています。

long affected = db.replace("table", null, cv);

クリックが速すぎる問題であると疑い始めており、SQLite 接続を閉じるのに十分な時間が与えられていません。私が識別できるクラッシュのパターンがないためです。3 回目の試行でクラッシュすることもあれば、8 回目の試行でクラッシュすることもあり、10 回目を過ぎても問題なく動作しているように見えることもあります。

それは可能でしょうか?

4

2 に答える 2

0

静的オブジェクトで close() メソッドを呼び出すため、必ずしも静的オブジェクトが「無効化」されるとは限りません。そのため、2 回目に openDb() メソッドで mDbHelper が null かどうかを確認すると、この条件が渡されるため、メソッドは意図せずに閉じたデータベースを返します。したがって、このクローズド データベースをクエリしようとすると、 illegalstateexception がスローされます。

試す:

public SQLiteDatabase closeDb() {
    mDbHelper.close()
    mDbHelper = null;
}

お役に立てば幸いです。

于 2013-06-25T02:13:36.337 に答える