我收到一些用户的以下错误。
无法从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。由于某些用户发生了此问题,所以我无法检测到发生这种情况的原因。你有什么主意吗如果您想了解更多信息或更多代码,请告诉我。提前致谢。
编辑
我的
projection
是null
,我有所有列。并非所有用户都遇到此问题。更新资料
我的问题是内存不足,因为我在项目的某个地方捕获了该异常,因此应用程序在其他地方崩溃了。
最佳答案
不要将大量数据存储在Android SQLite数据库中。 CursorWindow
只能容纳2MB的数据,任何大于该行的行都会引起类似的错误。
特别是COLUMN_THUMBNAIL
似乎是罪魁祸首。不是将图像数据存储在数据库中,而是将图像存储在文件系统中,而仅将路径存储在数据库中。
作为参考,只要gets thrown返回CursorWindow::getFieldSlot()
,则异常NULL
。越界索引是常见的原因,但事实并非如此-行号和列号均有效。全光标窗口是另一个原因。