У меня есть подпрограмма, которая запускает разные запросы к базе данных SQLite много раз в секунду. Через некоторое время я получу ошибку
"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
.