Решил схалявить в коде, в итоге два часа убил, чтобы найти ошибку с курсором SQLite в Android.
Текст ошибки:
Finalizing a Cursor that has not been deactivated or closed
Или
android.database.sqlite.DatabaseObjectNotClosedException:
Application did not close the cursor or database object that was opened here
Изначально было понятно, что где-то не закрывается курсор.
Перепроверил все курсоры, после использования все курсоры закрываются. Причем, стек ошибок показывал фрагмент, где именно ошибка, но понял это лишь под отладкой.
Вот фрагмент косячного кода:
public int getBufferCount(){
String sql = "SELECT COUNT(*) FROM " + TBL_BUFFER;
Cursor cursor = db.rawQuery(sql, null);
cursor.moveToFirst();
if(!cursor.isAfterLast()){
return cursor.getInt(0);//ошибка
}
cursor.close();
return 0;
}
Т.е. я делал
return cursor.getInt(0);, а курсор оставался открытым!
Исправленный вариант №1:
public int getBufferCount(){
String sql = "SELECT COUNT(*) FROM " + TBL_BUFFER;
Cursor cursor = db.rawQuery(sql, null);
cursor.moveToFirst();
int ret = 0;
if(!cursor.isAfterLast()){
ret = cursor.getInt(0);
}
cursor.close();
return ret;
}
Исправленный вариант №2:
public int getBufferCount(){
String sql = "SELECT COUNT(*) FROM " + TBL_BUFFER;
Cursor cursor = db.rawQuery(sql, null);
cursor.moveToFirst();
if(!cursor.isAfterLast()){
try{
return cursor.getInt(0);
}finally{
cursor.close();
}
}
cursor.close();
return 0;
}
p.s.: Всё, что имеет метод close(), должно быть closed!
Добрый день! Можно узнать на какой среде Вы пишете приложение на Андройд ?
Здравствуйте! В Eclipse.