无法从CursorWindow读取第34行第11行

时间:2015-03-28 05:56:05

标签: java android sqlite

我从某个用户那里得到了以下错误。

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

这个问题出现在以下几行:

@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()或者您没有一列。因为这个问题发生在一些用户身上,我无法察觉为什么会发生这种情况。你有什么想法吗?

如果您想要更多信息或更多代码告诉我。提前致谢。

修改

我的projectionnull,我拥有所有列。所有用户都没有遇到这个问题。

更新

我的问题是outOfMemory,因为我在项目的一个地方捕获了异常,应用程序在其他地方崩溃了。

2 个答案:

答案 0 :(得分:1)

不要将大数据存储在Android SQLite数据库中。 CursorWindow只能容纳2MB的数据,任何大于此的行都会导致这样的错误。

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

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

答案 1 :(得分:0)

我很确定您忘记将列添加到投影中,或者您没有在开头调用moveToFirst()