Курсор финализирован без предварительного закрытия() Android
В моем приложении у меня есть listview. Я получаю свои данные с помощью запроса из SQLiteDatabase. Когда я получаю данные из db, я получаю эту ошибку:
![error]()
Это происходит, когда я перехожу от строки 20 к 21.
![occur]()
Я попытался помещать cursor.deactivate() и cursor.close() в regel 50. Но без результата. Кто-нибудь знает, почему я получаю эту ошибку и как ее решить? Спасибо:)
Ответы
Ответ 1
Вы должны закрыть курсор перед базой данных. Поместите свой код в блок try
/catch
и в блок finally
, закройте курсор и закройте базу данных:
try {
db = ...
} catch(Exception ex) {
// Log the exception message or whatever you like
} finally {
try {
if( cursor != null && !cursor.isClosed())
cursor.close();
if( db.isOpen() )
db.close();
} catch(Exception ex) {}
}
Заключительная последовательность имеет большое значение при выполнении IO с БД или Поставщиками контента.
Для получения дополнительной информации см. эту ссылку
Ответ 2
чтобы найти такие проблемы, просто включите StrictMode для версии Debug:
public void onCreate() {
if (DEVELOPER_MODE) {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects()
.penaltyLog()
.penaltyDeath()
.build());
}
super.onCreate();
}
Дополнительная информация @
http://developer.android.com/reference/android/os/StrictMode.html
всего наилучшего,
Ответ 3
Всегда, не забудьте закрыть курсор, вызывая cursor.close() перед закрытием базы данных. Это должно решить вашу проблему.
Ответ 4
пусть действие управляет курсором lifecycly, используя startManagingCursor(c)
, и все будет хорошо.