Ho una routine che esegue query diverse su un database SQLite molte volte al secondo. Dopo un po 'che avrei avuto l'erroreSQLite Database Android Allocazione della finestra del cursore di 2048 kb non riuscita
"android.database.CursorWindowAllocationException: - Cursor window allocation of 2048 kb failed. # Open Cursors = "
appaiono in LogCat.
ho avuto l'utilizzo della memoria di registro applicazione, e in effetti quando l'utilizzo raggiunge un certo limite l'ottengo questo errore, il che implica che si esaurisca. La mia intuizione mi dice che il motore di database sta creando un NUOVO buffer (CursorWindow) ogni volta che eseguo una query, e anche se contrassegno i cursori .close(), né il garbage collector né SQLiteDatabase.releaseMemory()
sono abbastanza veloci per liberare memoria. Penso che la soluzione potrebbe risiedere nel "forzare" il database a scrivere sempre nello stesso buffer e non a crearne di nuovi, ma non sono riuscito a trovare un modo per farlo. Ho provato a creare un'istanza del mio CursorWindow, e ho provato a impostarlo su SQLiteCursor senza risultato.
¿Qualche idea?
EDIT: re richiesta di codice di esempio da @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 mi piacerebbe essere in grado di .setWindow()
prima di dare una nuova query, ed avere i dati inseriti nella stessa CursorWindow
ogni volta ricevo nuovi dati .
Non so qual è il problema .. :) ma che utilizzo per fare SQLiteOpenHelper classe Singleton. Quindi non ho mai riscontrato problemi come questo. –
No, non utilizzo SQLiteOpenHelper, creo una classe DataAccess statica che contiene un SQLiteDatabase. Funziona bene e dubito che il problema ci sia. Il problema ha più a che fare con le librerie SQLite che creano un NUOVO contenitore per posizionare i risultati di ogni nuova query, piuttosto che usare lo stesso contenitore più e più volte. E anche se riesco a chiudere il cursore, la velocità di pulizia del GC è più lenta della velocità con cui i nuovi contenitori vengono creati, producendo così il maiale della memoria. – alex
Puoi mostrare un po 'del tuo codice, in particolare quello che hai provato a fare con l'impostazione del proprio 'CursorWindow'? –