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)
我不确定我有同样的问题。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。
我为我找到了两种可能的解决方案:
获取所有项目时忽略缓冲区大的行:SELECT * FROM name WHERE length(text)<100000
选择修剪后的text:SELECT id,SUBSTR(text,0,100000) as text FROM name
| 归档时间: |
|
| 查看次数: |
1535 次 |
| 最近记录: |