当我从 Android 中的 sqlite 数据库查询返回游标时,它似乎包含固定数量的行,无论数据库发生什么情况,这些行都不会改变。例如,如果在光标打开时删除了某些行,我仍然可以引用已删除的行。这很好,但是它是如何工作的呢?
一种猜测可能是 sqlite 知道我有一个光标指向该行,因此保留了旧数据的副本。但是,如果我有 100 万行,删除它们并用 100 万不同的行替换它们,似乎需要缓存大量数据!
UPDATE:
我现在认为我们在 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 中的一个错误,因为大多数数据库都很小,缓存窗口可以容纳所有结果,但在大型数据库中,这会打击你。
上次我检查过,游标是基于创建它的 SQL 的数据库快照。很像数据集。如果更改数据库,游标可能不知道它们的快照已旧。您可以对游标执行重新查询,以根据创建游标的原始 SQL 获取新数据。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)