Mam rutynę, która uruchamia różne zapytania względem bazy danych SQLite wiele razy na sekundę. Po chwili bym się błądSQLite Android Database Przydzielenie okna kursora z 2048 kb nie powiodło się
"android.database.CursorWindowAllocationException: - Cursor window allocation of 2048 kb failed. # Open Cursors = "
pojawić w LogCat.
miałem zużycie pamięci aplikacji dziennika, a nawet gdy użycie osiągnie określony limit, otrzymuję ten błąd, sugerując, że zabraknie. Moja intuicja podpowiada mi, że silnik bazy danych tworzy nowy bufor (CursorWindow) za każdym razem, gdy uruchamiam zapytanie, a mimo tego, że zaznaczam kursory .close(), ani moduł do zbierania śmieci, ani SQLiteDatabase.releaseMemory()
nie są wystarczająco szybkie do uwolnienia pamięci. Myślę, że rozwiązaniem może być "wymuszenie" bazy danych, aby zawsze zapisywać w tym samym buforze, a nie tworzyć nowych, ale nie byłem w stanie znaleźć sposobu na zrobienie tego. Próbowałem tworzyć własne CursorWindow i próbowałem ustawić to i SQLiteCursor bezskutecznie.
¿Wszelkie pomysły?
EDIT: re przykład kodu wniosek @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);
}
Idealnie chciałbym móc .setWindow()
przed wydaniem nowej kwerendy i mieć dane wprowadzone do tego samego CursorWindow
Everytime I Poznawanie danych .
nie wiem jaki jest problem .. :) ale używam aby SQLiteOpenHelper klasy singleton. Więc nigdy nie znalazłem żadnych takich problemów. –
Nie używam SQLiteOpenHelper, tworzę statyczną klasę DataAccess, która zawiera bazę SQLiteDatabase. Działa to dobrze i wątpię, że problem istnieje. Problem polega bardziej na tym, że biblioteki SQLite tworzą NOWY kontener, w którym umieszcza się wyniki każdego nowego zapytania, zamiast ciągle używać tego samego kontenera. I chociaż mogę zamknąć kursor, szybkość, z jaką GC oczyszcza jest wolniejsza niż szybkość, z jaką tworzone są nowe pojemniki, tworząc w ten sposób pamięć pamięci. – alex
Czy możesz pokazać niektóre z kodu, w szczególności, co próbujesz zrobić z ustawieniem własnego 'CursorWindow'? –