私はAndroidでsqlite DBクエリからCursorを取得すると、DBに何が起こっても変更されない固定数の行が含まれているようです。たとえば、Cursorが開いているときに行の一部が削除された場合でも、削除された行は参照できます。これは素晴らしいですが、どのように機能しますか?カーソルは削除された行をどのように参照していますか?
sqliteは私がその行を指しているCursorを持っていることを知っているかもしれないので、古いデータのコピーを保持します。しかし、もし私が100万行を持っていて、それらを削除し、100万行の行に置き換えたとしても、キャッシュするデータはたくさんあるようです。
UPDATE:
私は今、私たちは、Androidで見るこのキャッシングは本当に防弾ではなく、SQLiteのの一部ではないことを考えています。私はそれに1,000,000行のデータベースを構築するテストを作成した後、いくつかの結果をプリントアウトしたdbを照会し、カーソルを開いたままにして、次に半分の行を削除し、最後に開いたカーソルにアクセスしようとしました。クラッシュです:ほとんどのデータベースは、キャッシュ・ウィンドウは、すべての結果を保持することができますが、大規模なデータベースでは、これはあなたを打つために起こっている小さいので
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のバグのように思えます。
このページ(http://www.sqlite.org/malloc.html)では、「SQLiteは動的メモリ割り当てを使用してクエリの結果を保持しています。これは結果がメモリにキャッシュされていることを示していますが、結果セットが非常に大きい場合は明らかに制限がありますが、キャッシュが大きすぎると一時ファイルを作成する必要があります。 – satur9nine