Room 中出现“在访问数据之前确保光标已正确初始化”错误

fth*_*dgn 5 android android-room

在 Crashlytics 上,我看到许多 Room 异常都带有以下消息:“在访问光标之前确保光标已正确初始化”。我无法在我的设备上产生此错误,并且该错误不会发生在特定的 Android 版本或设备型号上。

我在 Room 上找不到有关此错误的任何信息。SQLLite 存在一些问题,其中大多数是关于手工编写的有问题的 SQL 查询。

即使这个简单的查询在客户设备上也会出现错误。

@Query("SELECT * FROM UserAction WHERE UserAction.userId LIKE :userId " +
        " ORDER BY last_update_time DESC")
public List<UserAction> allList(String usedId);
Run Code Online (Sandbox Code Playgroud)

例外的是:

致命异常:java.lang.IllegalStateException:无法从 CursorWindow 读取第 1756 行、第 0 列。在访问游标中的数据之前,请确保游标已正确初始化。在 android.database.CursorWindow.nativeGetString(CursorWindow.java) 在 android.database.CursorWindow.getString(CursorWindow.java:438) 在 android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:66)

错误发生在 while 循环内生成的代码上

  while(_cursor.moveToNext()) {
    final UserAction _item;
    _item = new UserAction();
    _item.userId = _cursor.getString(_cursorIndexOfUserId); //Exception here
Run Code Online (Sandbox Code Playgroud)

vvk*_*wss 1

我不确定我有同样的问题。getAll我在( ) 函数中发生崩溃SELECT * FROM。我的堆栈:

java.lang.IllegalStateException:无法从 CursorWindow 读取第 83 行、第 0 列。在访问游标中的数据之前,请确保游标已正确初始化。在 android.database.CursorWindow.nativeGetLong(本机方法) 在 android.database.CursorWindow.getLong(CursorWindow.java:507) 在 android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:86) 在 android.database.AbstractCursor.moveToPosition (AbstractCursor.java:220) 在 android.database.AbstractCursor.moveToNext(AbstractCursor.java:245) 在 Dao_Impl.getAll(LoggingDao_Impl.java:99) 在 java.lang.Thread.run(Thread.java:838)

在这个异常之前,我有一个日志:

W/CursorWindow:窗口已满:请求分配 2282898 字节,可用空间 2086484 字节,窗口大小 2097152 字节

我的实体包含Stringcolumn text。我成功地将 2.2Mb 缓冲区插入其中。不幸的是安卓无法读取它。CursorWindow 的最大大小为 2 Mb。了解更多https://bugzilla.mozilla.org/show_bug.cgi?id=1280409

我为我找到了两种可能的解决方案:

  1. 获取所有项目时忽略缓冲区大的行:SELECT * FROM name WHERE length(text)<100000

  2. 选择修剪后的textSELECT id,SUBSTR(text,0,100000) as text FROM name