我有一個例程每秒多次對SQLite數據庫運行不同的查詢。一段時間後,我會得到錯誤SQLite Android數據庫光標窗口分配2048 kb失敗
"android.database.CursorWindowAllocationException: - Cursor window allocation of 2048 kb failed. # Open Cursors = "
出現在LogCat中。
我有應用程序日誌內存使用情況,實際上當使用量達到一定的限制時,我得到這個錯誤,意味着它用完了。我的直覺告訴我,每次運行查詢時,數據庫引擎都會創建一個NEW緩衝區(CursorWindow),即使我標記了.close()遊標,垃圾回收器和內存釋放都不夠快。我認爲解決方案可能在於「迫使」數據庫始終寫入相同的緩衝區,而不是創建新的數據庫,但我一直無法找到一種方法來做到這一點。我試圖實例化我自己的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
每次我得到新的數據數據。
我不知道是什麼問題.. :)但我使用,使SQLiteOpenHelper類單。所以我從來沒有發現任何這樣的問題。 –
不,我不使用SQLiteOpenHelper,我創建了一個包含SQLiteDatabase的靜態DataAccess類。這工作正常,我懷疑問題在那裏。這個問題更多的與SQLite庫創建一個NEW容器來放置每個新查詢的結果,而不是一次又一次地使用同一個容器。儘管我可以關閉光標,但是GC清理的速度比創建新容器的速度慢,因此會產生內存宏。 – alex
你可以顯示一些你的代碼,特別是你想要設置自己的'CursorWindow'嗎? –