SQLiteデータベースに対して毎秒何回も異なるクエリを実行するルーチンがあります。しばらくするとエラーが発生する2048 kbのSQLite Android Database Cursorウィンドウ割り当てに失敗しました
"android.database.CursorWindowAllocationException: - Cursor window allocation of 2048 kb failed. # Open Cursors = "
がLogCatに表示されます。
私はアプリのログメモリ使用量がありましたが、実際には使用量が一定の限界に達したときにこのエラーが発生し、それがなくなったことを意味します。私の直感は、クエリを実行するたびにデータベースエンジンが新しいバッファ(CursorWindow)を作成していることを示しています。また、カーソルを.close()に設定してもガベージコレクタもSQLiteDatabase.releaseMemory()
もメモリを解放するほど速くありません。私は、このソリューションは、データベースを常に同じバッファに書き込むように強制し、新しいバッファを作成するのではないと思っていますが、これを行う方法を見つけることができませんでした。私は自分自身のCursorWindowをインスタンス化しようとしましたが、SQLiteCursorを無駄に設定しようとしました。
¿任意のアイデアですか?
EDIT:@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
たびに入れたデータを持っているでしょう。
私は..問題が何であるかを知らない:)が、私はSQLiteOpenHelperクラスのシングルトンを作るために使用します。だから私はこのような問題は見つけられませんでした。 –
いいえ、SQLiteOpenHelperは使用しません。SQLiteDatabaseを含む静的DataAccessクラスを作成します。これは正常に動作し、私は問題がそこにあることを疑う。この問題は、同じコンテナを繰り返し使用するのではなく、新しいクエリの結果を配置する新しいコンテナを作成するSQLiteライブラリと関連があります。また、カーソルを閉じることもできますが、GCがクリーンアップする速度は、新しいコンテナが作成される速度よりも遅くなり、メモリ・ホッグが生成されます。 – alex
あなたのコードのいくつか、特に自分の 'CursorWindow'を設定しようとしたことを表示できますか? –