我收到一些用户的以下错误。

无法从CursorWindow中读取第11行第34行。在从游标访问数据之前,请确保正确初始化了游标。

此问题发生在以下行中:

@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中进行了大量搜索,但是其他问题是,例如,当您不调用moveToFirst()或没有一列时,就无法读取行-1或无法读取列-1。由于某些用户发生了此问题,所以我无法检测到发生这种情况的原因。你有什么主意吗

如果您想了解更多信息或更多代码,请告诉我。提前致谢。

编辑

我的projectionnull,我有所有列。并非所有用户都遇到此问题。

更新资料

我的问题是内存不足,因为我在项目的某个地方捕获了该异常,因此应用程序在其他地方崩溃了。

最佳答案

不要将大量数据存储在Android SQLite数据库中。 CursorWindow只能容纳2MB的数据,任何大于该行的行都会引起类似的错误。

特别是COLUMN_THUMBNAIL似乎是罪魁祸首。不是将图像数据存储在数据库中,而是将图像存储在文件系统中,而仅将路径存储在数据库中。

作为参考,只要gets thrown返回CursorWindow::getFieldSlot(),则异常NULL。越界索引是常见的原因,但事实并非如此-行号和列号均有效。全光标窗口是另一个原因。

10-07 19:20
查看更多