Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 安卓房间数据库抛出“;CursorWindowAllocationException:2048 kb的光标窗口分配失败”;_Java_Android_Android Studio - Fatal编程技术网

Java 安卓房间数据库抛出“;CursorWindowAllocationException:2048 kb的光标窗口分配失败”;

Java 安卓房间数据库抛出“;CursorWindowAllocationException:2048 kb的光标窗口分配失败”;,java,android,android-studio,Java,Android,Android Studio,我正在开发一个android应用程序,在这个应用程序中,我必须查询room数据库表中的所有列和行,其中的行可能在1到100000之间。在任何时候我都需要所有的行。应用程序在大多数情况下工作正常,但几天后,它崩溃,但以下提到的例外情况除外: android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=1 (# cursors opened b

我正在开发一个android应用程序,在这个应用程序中,我必须查询room数据库表中的所有列和行,其中的行可能在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)

android.database.CursorWindowAllocationException:2048KB的光标窗口分配失败。#打开游标=1(#此进程打开的游标=1)
位于android.database.CursorWindow(CursorWindow.java:108)
位于android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198)
位于android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:138)
位于android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:132)
位于android.database.AbstractCursor.moveToPosition(AbstractCursor.java:219)
位于android.database.AbstractCursor.moveToNext(AbstractCursor.java:268)
位于android.arch.persistence.room.InvalizationTracker$1.CheckUpdateTable(invalizationTracker.java:358)
在android.arch.persistence.room.invalizationtracker$1.run(invalizationtracker.java:329)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
运行(Thread.java:818)
开放式游标似乎没有任何问题,因为Room自己处理它。此外,打开的游标的数量在异常中清楚地提到为1

从日志中可以清楚地看到,CursorWindow的大小为2MB,分配失败,因为超出了查询大小。但是,有时即使表只有几行,它也会失败

我尝试了annotation
@Transaction
,但我不确定它是否成功


这个问题有什么解决办法吗?请注意,我没有直接使用SQLITE。这是我的房间。此外,我没有在表中保存任何复杂的数据。

您在行中存储了什么?行大小很重要。您的表中是否有任何可能较大的列,例如图像的
字节[]
?除此之外,您可能只是拥有一个过于分散的堆。请确保您的应用程序在后台运行(这样ART可以在Android 5.0-7.1设备上压缩堆,并且您的进程可以随时终止)。@Commonware No..I没有为表中的任何图像保存任何字节[]。@laalto表不包含复杂数据。是的,如果设备保持脱机状态,行数将继续增加。您好……有什么解决方案吗?您的行中存储了什么?行大小很重要。您的表中是否有任何可能较大的列,例如图像的
字节[]
?除此之外,您可能只是拥有一个过于分散的堆。请确保您的应用程序在后台运行(这样ART可以在Android 5.0-7.1设备上压缩堆,并且您的进程可以随时终止)。@Commonware No..I没有为表中的任何图像保存任何字节[]。@laalto表不包含复杂数据。是的,如果设备保持脱机状态,行数将继续增加。您好……有什么解决方案吗?