Когда я возвращаю 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, так как большинство баз данных маленькие, окно кэша может содержать все результаты, но в больших базах данных это вас поразит.