このディスカッションで説明されている問題と同様の問題があります。基になるデータベースが変更されたときに ListView を更新する必要がありますが、クエリは高価であるため、AsyncTask で実行しています。
更新された Cursor の準備ができたら、次のようにします。(これは、起動時にリストが最初に入力される方法でもあります。)
@Override
protected void onPostExecute(Cursor result) {
if (activity != null) {
if (currentCursor != null) {
// existing cursor is closed by adapter.changeCursor() so
// we don't need to explicitly close it here
stopManagingCursor(currentCursor);
}
currentCursor = result;
startManagingCursor(currentCursor);
if (adapter == null) {
adapter = getAdapter(result);
setListAdapter(adapter);
} else {
adapter.changeCursor(result);
}
activity.onGotList(result, dbAdapter);
}
}
これが私が得るエラーです。毎回発生するわけではなく、さらにイライラします。
Releasing statement in a finalizer. Please ensure that you explicitly call close() on your cursor: SELECT DISTINCT t._id AS _id, t.amount, t.date, t.memo, t.synced, t.flag, (children.pa
android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:62)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:100)
at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:46)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1412)
at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1382)
したがって、明らかにカーソルを正しく閉じていません。currentCursor.close()
発信カーソルが によって閉じられていることに依存する代わりに呼び出すとadapter.changeCursor()
、カーソルを 2 回閉じるか、カーソルを閉じることに関する警告が表示されますnull
。
これを行う正しい方法は何ですか?
私がリンクしたディスカッションでは、Dianne Hackborn がLoader
代わりに a を使用することを提案しています。私のコードは Android 2.1 で実行する必要があるため、これはオプションではありません。