У меня проблема, аналогичная описанной в этом обсуждении : мне нужно обновить ListView при изменении базовой базы данных, но запрос дорогой, поэтому я делаю это в AsyncTask.
Вот что я делаю, когда обновленный Курсор готов. (Это также, как список изначально заполняется при запуске.)
@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()
, то я получаю предупреждения о двойном закрытии Курсора или закрытии Курсора null
.
Как правильно это сделать?
В обсуждении, на которое я ссылался, Дайан Хэкборн предлагает вместо него использовать Loader
. Это не вариант для меня, так как мой код должен работать на Android 2.1.