Category Archive: SQLite

Ошибка: 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!

SQuirrel SQL Client подключание к базе данных SQLite

SQLite — легковесная встраиваемая реляционная база данных Для начала скачаем драйвер SQLite: sqlite-jdbc-3.7.2.jar Найдите папку, в которую установлен SQuirrel. В папку lib поместите файл sqlite-jdbc-3.7.2.jar. Если SQuirrel открыт, то закройте его, а затем снова откройте, и драйвер будет доступен. По умолчанию в SQuirrel настройки подключения к SQLite не установлены. Создать новый драйвер Перейдите во вкладку Drivers и нажмите синий плюсик ("Создать новый драйвер") Добавить драйвер Заполните поля следующим образом: Name: SQLite Example URL: jdbc:sqlite://DRIVE:/dirA/dirB/db.sqlite Class Name: org.sqlite.JDBC Где Class Name указывается пакет и класс, реализующий JDBC-драйвер, а Example URL указывается шаблон строки подключения, который будет показан как подсказка при создании подключения к SQLite. 03 Нажмите OK и драйвер появиться в списке загруженных драйверов. 04 Теперь перейдите во вкладку Aliases, нажмите синий плюсик для добавления нового подключения. 05 Придумайте название, выберите наш созданный драйвер "SQLite" и укажите путь к файлу, в котором хранится база данных SQLite. Также можете указать флаг Auto logon. Нажмите OK. 06 Созданное подключение можно увидеть в списке. Щелкните по нему мышкой два раза для открытия подключения. 07 Здесь мы видим открывшуюся базу. Также будьте внимательны при указании пути к файлу SQLite. Если вы укажете на несуществующий файл, то по указанному пути будет создана пустая база.