我有一个例程每秒多次对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'吗? –