Tengo una rutina que ejecuta diferentes consultas contra una base de datos SQLite muchas veces por segundo. Después de un tiempo me gustaría obtener el errorSQLite Android Database Asignación de la ventana del Cursor de 2048 kb falló
"android.database.CursorWindowAllocationException: - Cursor window allocation of 2048 kb failed. # Open Cursors = "
aparecen en LogCat.
Tenía el uso de la memoria de registro de la aplicación, y de hecho, cuando el uso alcanza un cierto límite, recibo este error, lo que implica que se agote. Mi intuición me dice que el motor de base de datos está creando un NUEVO buffer (CursorWindow) cada vez que ejecuto una consulta, y aunque marque el .close() los cursores, ni el recolector de basura ni SQLiteDatabase.releaseMemory()
son lo suficientemente rápidos como para liberar memoria. Creo que la solución puede consistir en "forzar" a la base de datos a escribir siempre en el mismo búfer y no crear nuevos, pero no he podido encontrar la manera de hacerlo. He intentado crear una instancia de mi propio CursorWindow, y he intentado configurarlo y SQLiteCursor en vano.
¿Alguna idea?
EDIT: re solicitud de código de ejemplo @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);
}
Idealmente me gustaría ser capaz de .setWindow()
antes de dar una nueva consulta, y tienen los datos puestos en la misma CursorWindow
cada vez que consigo nuevos datos .
No sé cuál es el problema .. :) pero yo uso para hacer SQLiteOpenHelper Singleton clase. Entonces nunca encontré ningún problema como este. –
No, no uso SQLiteOpenHelper, creo una clase de DataAccess estática que contiene una SQLiteDatabase. Esto funciona bien y dudo que el problema esté allí. El problema tiene más que ver con las bibliotecas SQLite que crean un contenedor NUEVO para colocar los resultados de cada nueva consulta, en lugar de usar el mismo contenedor una y otra vez. Y aunque puedo cerrar el cursor, la velocidad a la que el GC se limpia es más lenta que la velocidad a la que se crean los nuevos contenedores, lo que produce la acumulación de memoria. – alex
¿Puedes mostrar algo de tu código, particularmente lo que intentaste hacer con tu propio 'CursorWindow'? –