2015-03-28 2 views
0

У меня есть следующая ошибка от некоторых пользователей.Не удалось прочитать строку 34, col 11 из CursorWindow

Не удалось прочитать строку 34, col 11 из CursorWindow. Перед доступом к данным убедитесь, что курсор инициализирован правильно.

Этот вопрос happende в follwoing линии:

@Override 
    public void bindView(final Context context, Cursor MessageCursor, int position) { 

     final MessageEntity messageEntity = MessageDataSource.cursorToMessage(MessageCursor); 

     // more code 
    } 

cursorToMessage и является:

public static MessageEntity cursorToMessage(Cursor cursor) { 
     MessageEntity.Builder builder = new MessageEntity.Builder(); 
     builder.setId(cursor.getLong(cursor.getColumnIndexOrThrow(MessageTable.COLUMN_ID))) 
       .setMessageId(cursor.getString(cursor.getColumnIndexOrThrow(MessageTable.COLUMN_MESSAGE_ID))) 
       .setJabberId(cursor.getString(cursor.getColumnIndexOrThrow(MessageTable.COLUMN_JID))) 
       .setContactUsername(cursor.getString(cursor.getColumnIndexOrThrow(MessageTable.COLUMN_CONTACT_USERNAME))) 
       .setText(cursor.getString(cursor.getColumnIndexOrThrow(MessageTable.COLUMN_TEXT))) 
       .setType(MessageEntity.Type.getEnum(cursor.getString(cursor.getColumnIndexOrThrow(MessageTable.COLUMN_TYPE)))) 
       .setTimestamp(cursor.getString(cursor.getColumnIndexOrThrow(MessageTable.COLUMN_TIMESTAMP))) 
       .setDeliveryStatus(MessageEntity.DeliveryStatus.getEnum(cursor.getString(cursor.getColumnIndexOrThrow(MessageTable.COLUMN_STATUS)))) 
       .setUnread((cursor.getInt(cursor.getColumnIndexOrThrow(MessageTable.COLUMN_UNREAD)) > 0)) 
       .setOutgoing((cursor.getInt(cursor.getColumnIndexOrThrow(MessageTable.COLUMN_OUTGOING)) > 0)) 
       .setThumbnail(cursor.getString(cursor.getColumnIndexOrThrow(MessageTable.COLUMN_THUMBNAIL))) 
       .setJsonData(cursor.getString(cursor.getColumnIndexOrThrow(MessageTable.COLUMN_EXTRA_DATA))); 

     return builder.build(); 
    } 

Я найти много в SO, но другая проблема, как не удалось прочитать строку -1 или Не удалось прочитать столбец -1, что он вызван, когда вы не вызываете moveToFirst() или у вас нет одного столбца. поскольку эта проблема возникла для некоторых пользователей, я не могу определить, почему это произошло. У вас есть идея.

Если вам нужна дополнительная информация или более код, скажите мне. Заранее спасибо.

Редактировать

Мои projection является null и у меня есть все столбцы. эта проблема не была выполнена для всех пользователей.

Update

Моя проблема OutOfMemory, как я поймать это исключение в одном месте в моем проекте, приложение разбился в некоторых где-то еще.

ответ

1

Не храните большие данные в базе данных Android SQLite. CursorWindow может хранить только 2 МБ данных, любая строка больше, чем это приведет к ошибке, подобной этой.

В частности, виновником является COLUMN_THUMBNAIL. Вместо хранения данных изображения в базе данных, храните изображения в файловой системе и просто сохраняйте путь в базе данных.

Справочно, исключение gets thrown всякий раз, когда CursorWindow::getFieldSlot() возвращает NULL. Индексы за пределами границ являются общей причиной этого, но это не так с вами - как номера строк, так и столбцы действительны. Еще одна причина - полное окно курсора.

+0

спасибо за ваш ответ, я не храню данные изображения, я просто храню один токен для получения из Интернета или устройства. Сколько можно обрабатывать большие данные? потому что это приложение для обмена сообщениями. –

+0

Не нужно представлять данные изображения, а также любые данные, которые делают строку размером более 2 МБ. – laalto

+0

Есть ли другая ситуация, когда случилось это исключение? например, доступ к двум потокам на одном из данных или что-то вроде этого –

0

Я уверен, что вы забыли добавить столбец в проекцию или что вы не вызывали moveToFirst() в начале.

+0

Кевин, как я сказал в моем вопросе, эта проблема возникла для некоторого пользователя (35 пользователей 300000). если я забыл колонку, я получил ошибку от всего пользователя. и когда вы забыли добавить один столбец, вы получите не можете прочитать строку x Столбец -1 –

+0

@shayanpourvatan Я бы предложил не использовать getColumnIndexOrThrow, а точку останова и перешагнуть до разрыва. –

+0

см. Https://developer.android.com/reference/android/database/Cursor.html#getColumnIndexOrThrow%28java.lang.String%29. –

Смежные вопросы