SQLite データベースに対してさまざまなクエリを毎秒何度も実行するルーチンがあります。しばらくすると、エラーが発生します
"android.database.CursorWindowAllocationException: - Cursor window allocation of 2048 kb failed. # Open Cursors = "
LogCat に表示されます。
アプリでメモリ使用量をログに記録しましたが、実際に使用量が特定の制限に達すると、このエラーが発生し、不足していることを意味します。私の直感では、クエリを実行するたびにデータベース エンジンが新しいバッファ (CursorWindow) を作成していることがわかります。カーソルを .close() しても、ガベージ コレクタもSQLiteDatabase.releaseMemory()
メモリを解放する速度も十分ではありません。解決策は、データベースが常に同じバッファーに書き込み、新しいバッファーを作成しないように「強制」することにあると思いますが、これを行う方法を見つけることができませんでした。私は自分の CursorWindow をインスタンス化し、それに SQLiteCursor を設定しようとしましたが、役に立ちませんでした。
何か案は?
編集: @GrahamBorland からのコード リクエストの例:
public static CursorWindow cursorWindow = new CursorWindow("cursorWindow");
public static SQLiteCursor sqlCursor;
public static void getItemsVisibleArea(GeoPoint mapCenter, int latSpan, int lonSpan) {
query = "SELECT * FROM Items"; //would be more complex in real code
sqlCursor = (SQLiteCursor)db.rawQuery(query, null);
sqlCursor.setWindow(cursorWindow);
}
理想的には、新しいクエリを発行する前にできるようにし.setWindow()
て、新しいデータを取得するたびに同じデータを入れたいと思っていCursorWindow
ます。