移动游标时出现android.database.CursorWindowAllocationException异常

17
我正在使用SQLite数据库,但经常会出现运行时错误,而我无法找到其来源。在查询之后,我使用moveToFirst来指向检索到的第一条记录,有时这会触发一个android.database.CursorWindowAllocationException异常。除了这个异常之外,还有以下句子:"Cursor window allocation of 2048kb failed.# open Cursors=736 (#cursors opendby this proc=736)"。

在Android文档中,我还没有找到与此异常相关的任何信息。有人知道它的原因和避免它的方法吗?

1个回答

40

这个错误几乎总是由于在使用完光标后没有关闭它而引起的。每次打开一个游标,都需要内存来映射游标所表示的数据,而该内存在光标关闭之前无法释放。为此目的可用的内存有限,因此如果不关闭游标并且应用程序继续打开新的游标,则很可能会在某个时刻发生此错误。

我建议您检查代码,确保所有创建的游标在某个时刻被关闭。还要小心使用任何在循环中打开游标的代码-您的错误消息显示“打开的游标= 736”,这表明在某种循环中有大量游标活动。


很好的观点。这帮助我发现了一个使用光标和双重循环的粗心错误。纯粹的混乱。 - Rarw
这也发生在我身上,但它读取的是“Open Cursors=2”,而当旧的光标从“isClosed()”返回false时,我只查询一个新的光标...这很奇怪。 - themarketka
1
我也遇到了同样的问题,而且我看到了 Open Cursors =1。有人有什么提示吗? - Sivakumar S
可能是某种类型的 OutOfMemoryError 错误? - manfcas
在queryBuilder.query()的情况下,我们如何关闭游标? - Kishita Variya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接