Завершение курсора, который не был деактивирован или закрыт после обновления / вставки

Я получил наиболее распространенную ошибку, когда я работал с SQLite. К сожалению, я не смог найти ответ на свой вопрос, потому что, когда возникает эта ошибка, я не использую курсор. Эта ошибка появляется после вставки + обновления. Есть текст ошибки:

09-16 08:03:33.253: E/Cursor(1436): Finalizing a Cursor that has not been deactivated or closed. database = /data/data/*******/databases/settings.db, table = null, query = select * from preferences where pref_name = 'preference'
09-16 08:03:33.253: E/Cursor(1436): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
09-16 08:03:33.253: E/Cursor(1436):     at android.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:210)
09-16 08:03:33.253: E/Cursor(1436):     at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53)
09-16 08:03:33.253: E/Cursor(1436):     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345)
09-16 08:03:33.253: E/Cursor(1436):     at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1315)
09-16 08:03:33.253: E/Cursor(1436):     at ****.db.SettingsSQLiteHelper.updateValue(SettingsSQLiteHelper.java:132)
09-16 08:03:33.253: E/Cursor(1436):     at ****.PreferencesActivity$1.onClick(PreferencesActivity.java:67)
09-16 08:03:33.253: E/Cursor(1436):     at android.view.View.performClick(View.java:2408)
09-16 08:03:33.253: E/Cursor(1436):     at android.view.View$PerformClick.run(View.java:8816)
09-16 08:03:33.253: E/Cursor(1436):     at android.os.Handler.handleCallback(Handler.java:587)
09-16 08:03:33.253: E/Cursor(1436):     at android.os.Handler.dispatchMessage(Handler.java:92)
09-16 08:03:33.253: E/Cursor(1436):     at android.os.Looper.loop(Looper.java:123)
09-16 08:03:33.253: E/Cursor(1436):     at android.app.ActivityThread.main(ActivityThread.java:4627)
09-16 08:03:33.253: E/Cursor(1436):     at java.lang.reflect.Method.invokeNative(Native Method)
09-16 08:03:33.253: E/Cursor(1436):     at java.lang.reflect.Method.invoke(Method.java:521)
09-16 08:03:33.253: E/Cursor(1436):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
09-16 08:03:33.253: E/Cursor(1436):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
09-16 08:03:33.253: E/Cursor(1436):     at dalvik.system.NativeStart.main(Native Method)

Существует код, после его выполнения, когда приложение пытается выполнить любой SQL, я получаю ошибку, которая была описана выше:

public boolean updateValue(String property, String value) {
        SQLiteDatabase database = getWritableDatabase();
        try {
            ContentValues cv = new ContentValues();
            cv.put(COLUMN_PREFNAME, property);
            cv.put(COLUMN_PREFVALUE, value);            
            if (database.rawQuery(
                    "select * from " + TABLE_PREFERENCES + " where "
                            + COLUMN_PREFNAME + " = '" + property + "'", null)
                    .getCount() < 1) {
                Log.i("MyLog", "There wasn't property " + property
                        + " and system inserted new row");
                database.insert(TABLE_PREFERENCES, null, cv);
            } else {
                cv.clear();
                cv.put(COLUMN_PREFVALUE, value); 
                database.update(TABLE_PREFERENCES, cv, COLUMN_PREFNAME
                        + "='" + property + "'", null);
            }
            database.close();
        } catch (Exception e) {
            Log.e("MyLog", "Error in SettingsDB.updateValue :: " + e);
            database.close();
            return false;
        }
        return true;
    }

Подводя итог, при первом запуске приложения выполняется метод, который был описан выше, для настройки параметров приложения. После этого метода приложение не может запустить любой SQL из-за ошибки. Когда я перезапускаю приложение, оно работает хорошо, потому что приложение не запускает метод снова. Я считаю, что есть какой-то невидимый курсор, который я не закрывал. Не могли бы вы посоветовать мне, что я должен добавить или закрыть, чтобы удалить эту ошибку? Спасибо!

2 ответа

Решение

Как сказал ianhanniballake, rawQuery возвращает курсор, который вы не закрываете. Но вы не используете переменную курсора, поэтому лучше закрывать базу данных в finally block не в try block

rawQuery возвращает курсор, который вы не закрываете.

Другие вопросы по тегам