我正在开发一个Android应用程序,其中我必须查询会议室数据库中表中的所有列和行,其中该行可能具有1到100000之间的行。在任何时候,我都需要所有行。应用在大多数情况下都可以正常运行,但几天后就会崩溃,但出现以下异常:
android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=1 (# cursors opened by this proc=1)
at android.database.CursorWindow.<init>(CursorWindow.java:108)
at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198)
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:138)
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:132)
at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:219)
at android.database.AbstractCursor.moveToNext(AbstractCursor.java:268)
at android.arch.persistence.room.InvalidationTracker$1.checkUpdatedTable(InvalidationTracker.java:358)
at android.arch.persistence.room.InvalidationTracker$1.run(InvalidationTracker.java:329)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
打开的游标似乎没有任何问题,因为 Room 会自行处理。另外,打开游标的数量在例外中明确提到为1。
从日志中很明显, CursorWindow的大小为2 MB,并且由于超出查询大小而分配失败。但是,即使表只有几行,它有时也会失败。
我尝试使用注释@Transaction
,但是我不确定注释是否成功。
在任何地方都可以解决此问题吗?请注意,我不是直接使用SQLITE 。是房间。另外,我没有在表中保存任何复杂数据。