Ошибка «Убедитесь, что курсор инициализирован правильно перед доступом к данным из него» в комнате - PullRequest
1 голос
/ 03 октября 2019

В 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);

Исключением является:

Неустранимое исключение: java.lang.IllegalStateException: Не удалось прочитать строку 1756, столбец 0 из CursorWindow. Убедитесь, что курсор инициализирован правильно, прежде чем получить доступ к данным из него. в android.database.CursorWindow.nativeGetString (CursorWindow.java) в android.database.CursorWindow.getString (CursorWindow.java:438) в android.database.AbstractWindowedCursor.getString (AbstractWindowedCursor.java:66)

1012 *1011* 10121013 * Ошибка возникает в сгенерированном коде внутри цикла while
  while(_cursor.moveToNext()) {
    final UserAction _item;
    _item = new UserAction();
    _item.userId = _cursor.getString(_cursorIndexOfUserId); //Exception here

1 Ответ

0 голосов
/ 17 октября 2019

Я не уверен, что у меня такая же проблема. Я получаю сбой в функции getAll (SELECT * FROM). Мой стек:

java.lang.IllegalStateException: Не удалось прочитать строку 83, столбец 0 из CursorWindow. Убедитесь, что курсор инициализирован правильно, прежде чем получить доступ к данным из него. в android.database.CursorWindow.nativeGetLong (собственный метод) в android.database.CursorWindow.getLong (CursorWindow.java:507) в android.database.AbstractWindowedCursor.getLong (AbstractWindowedCursor.java:86) в android.databaseor.ove(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 байт

Моя сущность содержит String столбец text. Я вставляю 2.2Mb буфер в него успешно. К сожалению, Android не может прочитать это. Максимальный размер для CursorWindow составляет 2 Мб. Подробнее https://bugzilla.mozilla.org/show_bug.cgi?id=1280409.

Я нашел два возможных решения для меня:

  1. Игнорировать строку с большим буфером, когда получаю все элементы: SELECT * FROM name WHERE length(text)<100000

  2. Выбор обрезки text: SELECT id,SUBSTR(text,0,100000) as text FROM name

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...