Ошибка: Finalizing a Cursor that has not been deactivated or closed

Решил схалявить в коде, в итоге два часа убил, чтобы найти ошибку с курсором 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!
Поделиться данной статьей через:  

2 комментария

  1. Damir:

    Добрый день! Можно узнать на какой среде Вы пишете приложение на Андройд ?

  2. Naik:

    Здравствуйте! В Eclipse.

Добавить комментарий для Naik Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.