Tôi có một thường trình chạy các truy vấn khác nhau đối với cơ sở dữ liệu SQLite nhiều lần trong một giây. Sau một thời gian, tôi sẽ gặp lỗiSQLite Cơ sở dữ liệu Android Phân bổ cửa sổ con trỏ 2048 kb không thành công
"android.database.CursorWindowAllocationException: - Cursor window allocation of 2048 kb failed. # Open Cursors = "
xuất hiện trong LogCat.
Tôi đã sử dụng bộ nhớ đăng nhập ứng dụng và thực sự khi mức sử dụng đạt đến giới hạn nhất định, tôi nhận được lỗi này, ngụ ý rằng nó hết. Trực giác của tôi nói với tôi rằng công cụ cơ sở dữ liệu đang tạo bộ đệm MỚI (CursorWindow) mỗi lần tôi chạy truy vấn và mặc dù tôi đánh dấu con trỏ .close(), không phải bộ thu gom rác cũng không phải SQLiteDatabase.releaseMemory()
đủ nhanh để giải phóng bộ nhớ. Tôi nghĩ rằng các giải pháp có thể nằm trong "buộc" cơ sở dữ liệu để luôn luôn viết vào cùng một bộ đệm, và không tạo ra những cái mới, nhưng tôi đã không thể tìm thấy một cách để làm điều này. Tôi đã thử instantiating CursorWindow của riêng tôi, và cố gắng thiết lập nó và SQLiteCursor không có kết quả.
¿Bất kỳ ý tưởng nào?
EDIT: tái yêu cầu mã ví dụ từ @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);
}
Lý tưởng nhất là tôi muốn để có thể .setWindow()
trước khi đưa ra một truy vấn mới, và có các dữ liệu đưa vào cùng CursorWindow
mọi tôi nhận được dữ liệu mới .
Tôi không biết vấn đề là gì .. :) nhưng tôi sử dụng để làm lớp singleton SQLiteOpenHelper. Vì vậy, tôi không bao giờ tìm thấy bất kỳ vấn đề như thế này. –
Không, tôi không sử dụng SQLiteOpenHelper, tôi tạo một lớp DataAccess tĩnh có chứa một SQLiteDatabase. Điều này làm việc tốt và tôi nghi ngờ vấn đề là có. Vấn đề có nhiều hơn để làm với các thư viện SQLite tạo ra một container mới để đặt kết quả của mỗi truy vấn mới, thay vì sử dụng cùng một container hơn và hơn nữa. Và mặc dù tôi có thể đóng con trỏ, tốc độ làm sạch GC sẽ chậm hơn tốc độ tạo vùng chứa mới, do đó tạo ra bộ nhớ. – alex
Bạn có thể hiển thị một số mã của bạn, đặc biệt là những gì bạn đã cố gắng thực hiện với việc thiết lập 'CursorWindow' của riêng bạn? –