SQLite Android Database Cursor window allocation of 2048 kb failed。怎么办?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (45)

我有一个例程,它以每秒多次对SQLite数据库运行不同的查询。过一段时间我就会发现这个错误

"android.database.CursorWindowAllocationException: - Cursor window allocation of 2048 kb failed. # Open Cursors = "出现在日志中。

我使用了应用程序日志内存,实际上,当使用达到一定的限制时,我得到了这个错误,这意味着它已经用完了。我尝试实例化我自己的CursorWindow,并尝试将其设置为和SQLiteCursor,但没有效果。

有什么想法吗?

示例代码请求:

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每次我得到新的数据。

提问于
用户回答回答于

如果您需要挖掘大量SQL代码,您可以通过在MainActivity中放置以下代码片段来启用StrictMode来加快调试速度。如果检测到泄漏的数据库对象。

@Override
protected void onCreate(Bundle savedInstanceState) {
   if (BuildConfig.DEBUG) {     
         StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
         .detectLeakedSqlLiteObjects()
         .detectLeakedClosableObjects()
         .penaltyLog()
         .penaltyDeath()
         .build());
    }
    super.onCreate(savedInstanceState);
    ...
    ...
用户回答回答于

造成此错误的原因通常是非闭合游标。

Cursor cursor = null;
try {
    cursor = db.query(...
    // do some work with the cursor here.
} finally {
    // this gets called even if there is an exception somewhere above
    if(cursor != null)
        cursor.close();
}

扫码关注云+社区