【问题标题】:Cursor is not initialized correctly光标未正确初始化
【发布时间】:2013-01-01 17:03:08
【问题描述】:

我在尝试检索本地数据库中表的所有条目时遇到此错误:

java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.contactappca2/com.example.contactappca2.ViewActivity}:java.lang.IllegalStateException:无法从 CursorWindow 读取第 0 行第 0 列.确保在从光标访问数据之前正确初始化光标。

原因:java.lang.IllegalStateException:无法从 CursorWindow 读取第 0 行第 0 列。确保在从光标访问数据之前正确初始化光标。

这是我在 DbAdapter 类中检索条目的方法:

public List<Contact>getAllContacts(){
    contacts = new ArrayList<Contact>();
    cursor = db.query(TABLE_NAME, new String [] {COLUMN_NAME, COLUMN_NUMBER, COLUMN_EMAIL, COLUMN_IMG}, null,null,null,null,null);
    if(cursor.moveToFirst()){
        do{
            c = new Contact();
            c.setName(cursor.getString(0), null);
            c.setNumber(cursor.getString(1));
            c.setEmail(cursor.getString(2));
            byte [] blob = cursor.getBlob(cursor.getColumnIndex(COLUMN_IMG));
            ByteArrayInputStream inputStream = new ByteArrayInputStream(blob);
            Bitmap b = BitmapFactory.decodeStream(inputStream); 
            c.setPicture(b);
            contacts.add(c);
        }while(cursor.moveToNext());
    }

    return contacts;
}

知道我做错了什么吗?非常感谢。

【问题讨论】:

  • 我的理论是,您的查询无法为成功生成 Cursor 所需的图像分配所需的所有内存。在不请求Blob列的情况下尝试该方法以及涉及它的后续方法,看看是否成功。
  • 好的,如果是这种情况,有办法解决内存问题吗?
  • @mango 我按照你的建议做了,光标问题不再是问题。什么可能导致内存问题?
  • 你确定光标已经初始化了吗?这个 sn-p 显示了您访问游标的过程,但不显示您如何/如果您初始化它和/或您的“db”。

标签: android sqlite cursor android-cursor


【解决方案1】:

要做的一件事是确保你的另一个Cursors 在你做这个之前已经关闭(为了释放内存)。

但是,如果您尝试将内容分块取出,您会看到更好的结果,这与无休止地加载列表视图或类似的效果非常相似。

但我真的不得不说,如果我一开始就遇到这样的问题,我会放弃使用SQLite 来保存这样的完整对象的想法。最好将这些图像存储在 sd 卡或本地内存中,并且只将图像位置或至少名称保存在数据库中,然后以这种方式管理您的内容。

【讨论】:

猜你喜欢
  • 2020-08-16
  • 2016-07-28
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
  • 2020-04-21
  • 2012-06-17
  • 2022-01-22
相关资源
最近更新 更多