2011-09-09 5 views
3

私は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のバグのように思えます。

+0

このページ(http://www.sqlite.org/malloc.html)では、「SQLiteは動的メモリ割り当てを使用してクエリの結果を保持しています。これは結果がメモリにキャッシュされていることを示していますが、結果セットが非常に大きい場合は明らかに制限がありますが、キャッシュが大きすぎると一時ファイルを作成する必要があります。 – satur9nine

答えて

2

最後にチェックしたところ、カーソルは、作成したSQLに基づくデータベースのスナップショットです。データセットによく似ています。データベースを変更すると、カーソルはスナップショットが古いことを知らないことがあります。カーソルを再作成して、カーソルを作成した元のSQLに基づいて新しいデータを取得することができます。

+0

私はあなたが正しいと思いますが、これについてもっと完全な文書があれば私は不思議です。 – satur9nine

+0

SQLiteDatabaseドキュメントから:Cursorオブジェクト。最初のエントリの前に配置されます。カーソルは同期されていないことに注意してください。詳細はドキュメントを参照してください。 – Pyrodante

+0

これに関連するドキュメントへのリンクがありますか?もう少し詳しく知りたいのですが、一時ファイルがファイルシステムに書き込まれていますか?このように、多くの行を含むクエリを実行することは大きなペナルティになります。 – satur9nine

関連する問題