У меня есть процедура, которая запускает разные запросы к базе данных SQLite много раз в секунду. Через некоторое время я бы получил ошибку
"android.database.CursorWindowAllocationException: - Cursor window allocation of 2048 kb failed. # Open Cursors = "
появляются в LogCat.
У меня было использование памяти журнала приложения, и действительно, когда использование достигает определенного предела, я получаю эту ошибку, подразумевая, что она заканчивается. Моя интуиция подсказывает мне, что механизм базы данных создает НОВЫЙ буфер (CursorWindow )каждый раз, когда я запускаю запрос, и хотя я помечаю.close ()курсоры, ни сборщик мусора, ни SQLiteDatabase.releaseMemory()
не достаточно быстро освобождает память. Я думаю, что решение может заключаться в том, чтобы «заставить» базу данных всегда записывать в один и тот же буфер, а не создавать новые, но я не смог найти способ сделать это. Я попытался создать свой собственный CursorWindow и безрезультатно попытался установить его и SQLiteCursor.
Любые идеи?
РЕДАКТИРОВАТЬ :запрос примера кода от @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
каждый раз, когда я получаю новые данные.