2011-12-29 1 views
1

Мой вопрос очень похож на этот one, но немного отличается. Я получаю следующую ошибку, когда я просто пытаюсь запросить все в моей таблице, которая была зашифрована SQLCiper.SQLCipher - Завершение курсора, который не был деактивирован error

12-29 11:37:54.329: E/Cursor(10837): Finalizing a Cursor that has not been deactivated or closed. database = /data/data/com.company.myapp/databases/data, table = data_table, query = SELECT rowid, data FROM data_table 
12-29 11:37:54.329: E/Cursor(10837): info.guardianproject.database.sqlcipher.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here 
12-29 11:37:54.329: E/Cursor(10837): at info.guardianproject.database.sqlcipher.SQLiteCursor.<init>(SQLiteCursor.java:225) 
12-29 11:37:54.329: E/Cursor(10837): at info.guardianproject.database.sqlcipher.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53) 
12-29 11:37:54.329: E/Cursor(10837): at info.guardianproject.database.sqlcipher.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1410) 
12-29 11:37:54.329: E/Cursor(10837): at info.guardianproject.database.sqlcipher.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1289) 
12-29 11:37:54.329: E/Cursor(10837): at info.guardianproject.database.sqlcipher.SQLiteDatabase.query(SQLiteDatabase.java:1243) 
12-29 11:37:54.329: E/Cursor(10837): at info.guardianproject.database.sqlcipher.SQLiteDatabase.query(SQLiteDatabase.java:1325) 
12-29 11:37:54.329: E/Cursor(10837): at com.company.appName.DatabaseManager.queryAllItems(DatabaseManager.java:105) 

Я думал, что эта ошибка будет только в том случае, если я забыл закрыть Cursor после того как я был сделан с помощью его, но, кажется, что я получаю эту ошибку еще до того, я могу начать использовать его.

Вот код, который находится в методе queryAllItems():

public Cursor queryAllItems() { 
    return database.query(DATABASE_TABLE, new String[] {KEY_ID, KEY_DATA}, null, null, null, null, null); 
} 
+1

Ошибка указывает, что здесь был открыт «Курсор» ». Для меня это означает, что вы успешно вызвали 'queryAllItems()', но никогда не закрывали «Курсор», и он говорит вам, где вы создали «Курсор» в первую очередь. – CommonsWare

+0

Вы совершенно правы, я вложил пару отладочных маркеров и заметил, что ошибка произошла после того, как все запросы были выполнены. Наверное, я был введен в заблуждение этой трассировкой стека. – Brian

ответ

1

Я был введен в заблуждение трассировкой стека, и оказалось, что мне просто нужно позвонить Cursor.deactivate() и Cursor.close() после того, как все мои операции над запросом были выполнены.

0

После создания курсора, если вы звоните startManagingCursor(c); будет решить эту проблему. Здесь 'c' - ссылка на курсор.

Смежные вопросы