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. Если вы укажете на несуществующий файл, то по указанному пути будет создана пустая база.