Ich habe eine Routine, die viele Abfragen mehrmals pro Sekunde für eine SQLite-Datenbank ausführt. Nach einer Weile würde ich den Fehler bekommen
"android.database.CursorWindowAllocationException: - Cursor window allocation of 2048 kb failed. # Open Cursors = "
erscheinen in LogCat.
Ich hatte die Speicherauslastung des App-Protokolls, und wenn die Nutzung eine bestimmte Grenze erreicht, wird dieser Fehler angezeigt, was bedeutet, dass er nicht mehr verfügbar ist. Meine Intuition sagt mir, dass das Datenbankmodul jedes Mal, wenn ich eine Abfrage ausführe, einen NEUEN Puffer (CursorWindow) erstellt, und obwohl ich die Cursor .close () markiere, können weder der Garbage Collector noch SQLiteDatabase.releaseMemory()
schnell genug Speicher freigeben . Ich denke, die Lösung könnte darin bestehen, die Datenbank zu "zwingen", immer in denselben Puffer zu schreiben und keine neuen zu erstellen, aber ich konnte keinen Weg finden, dies zu tun. Ich habe versucht, mein eigenes CursorWindow zu instanziieren, und versucht, es ohne Erfolg auf SQLiteCursor zu setzen.
Irgendwelche Ideen?
BEARBEITEN: Beispielcodeanforderung von @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);
}
Idealerweise möchte ich in der Lage sein, .setWindow()
bevor ich eine neue Abfrage stelle, und die Daten CursorWindow
jedes Mal, wenn ich neue Daten erhalte , in die gleichen Daten einfügen.