Как курсор ссылается на удаленные строки? - PullRequest
3 голосов
/ 10 сентября 2011

Когда я возвращаю Cursor из запроса sqlite DB в Android, он, кажется, содержит фиксированное количество строк, которое не изменяется независимо от того, что происходит с DB.Если, например, некоторые строки будут удалены при открытом курсоре, я все равно смогу ссылаться на строки, которые были удалены.Это хорошо, но как это работает?

Можно предположить, что sqlite знает, что у меня есть курсор, который указывает на эту строку, и поэтому хранит копию старых данных.Но что, если бы у меня было миллион строк, я их удалил и заменил миллионами разных строк, похоже, что кешируется много данных!

ОБНОВЛЕНИЕ:

Iтеперь я думаю, что это кэширование, которое мы видим в Android, не является пуленепробиваемым и не является частью SQLite.Я создал тест, который строит базу данных с 1 000 000 строк в ней, затем я запросил в БД распечатал некоторые результаты и оставил курсор открытым, затем я удалил половину строк, наконец, я попытался получить доступ к оставленному курсору и результатуэто сбой:

04-05 18:17:16.141 E/AndroidRuntime(19655): java.lang.IllegalStateException: Couldn't read row 0, col 0 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
04-05 18:17:16.141 E/AndroidRuntime(19655):     at android.database.CursorWindow.nativeGetLong(Native Method)
04-05 18:17:16.141 E/AndroidRuntime(19655):     at android.database.CursorWindow.getLong(CursorWindow.java:507)
04-05 18:17:16.141 E/AndroidRuntime(19655):     at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:75)
04-05 18:17:16.141 E/AndroidRuntime(19655):     at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:220)
04-05 18:17:16.141 E/AndroidRuntime(19655):     at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:237)
04-05 18:17:16.141 E/AndroidRuntime(19655):     at com.jacob.DirectDbActivity$4.run(DirectDbActivity.java:88)

Это похоже на ошибку в Android, так как большинство баз данных маленькие, окно кэша может содержать все результаты, но в больших базах данных это вас поразит.

1 Ответ

2 голосов
/ 10 сентября 2011

В последний раз, когда я проверял, курсор - это снимок базы данных на основе SQL, который ее создал.Очень похоже на набор данных.Если вы измените базу данных, курсоры могут не знать, что их снимок старый.Вы можете выполнить повторный запрос для курсора, чтобы получить свежие данные на основе исходного SQL, который создал курсор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...