我从某个用户那里得到了以下错误。
无法从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()
或者您没有一列。因为这个问题发生在一些用户身上,我无法察觉为什么会发生这种情况。你有什么想法吗?
如果您想要更多信息或更多代码告诉我。提前致谢。
修改
我的projection
是null
,我拥有所有列。所有用户都没有遇到这个问题。
更新
我的问题是outOfMemory,因为我在项目的一个地方捕获了异常,应用程序在其他地方崩溃了。
答案 0 :(得分:1)
不要将大数据存储在Android SQLite数据库中。 CursorWindow
只能容纳2MB的数据,任何大于此的行都会导致这样的错误。
特别是,COLUMN_THUMBNAIL
似乎是罪魁祸首。不是将图像数据存储在数据库中,而是将图像存储在文件系统中,只将路径存储在数据库中。
作为参考,只要gets thrown返回NULL
,就会遇到异常CursorWindow::getFieldSlot()
。越界索引是一个常见的原因,但事实并非如此 - 行号和列号都是有效的。全光标窗口是另一个原因。
答案 1 :(得分:0)
我很确定您忘记将列添加到投影中,或者您没有在开头调用moveToFirst()
。