【问题标题】:Android: Retrieving data from the database issueAndroid:从数据库问题中检索数据
【发布时间】:2026-02-22 05:10:01
【问题描述】:

我创建了以下方法来从数据库中检索存储的设置:

public String getEntry(long rowIndex){
    String value = "";

    Cursor c = db.query(DATABASE_TABLE, new String[] {KEY_NAME, VALUE}, KEY_NAME + "=" + rowIndex, null, null, null, null);
    int columnIndex = c.getColumnIndex(VALUE);
    int rowsCount = c.getCount();
    if(rowsCount > 0){
        String value = c.getString(columnIndex);
    }

    return value;
}

在调试时,我可以看到光标 c 包含两列和一行,但是当涉及到行时

String value = c.getString(columnIndex);

它抛出 CursorIndexOutOfBoundsException 尽管 columnIndex = 1 应该指向一个有效的条目。

有人知道这里出了什么问题吗?

【问题讨论】:

    标签: database android sqlite


    【解决方案1】:

    我不知道你使用的 DB-Wrapper,但我想做出两个猜测,因为我对 Sqlite 有点了解。

    可能是:

    1. 在我的包装器和 C-API 中,每次要检索数据时都需要执行一个步骤(或下一步)。您的例外表明,您没有位于正确的行。因此,您可以尝试“下一步”或“步骤”(您的 DB-Wrapper 所理解的内容)。

    2. 这个c.getCount() 也会带来麻烦。 getCount 可以做什么,依靠游标?它可以迭代游标直到完成。发生这种情况时,光标已用尽,您只能重做整个事情。在这一点上阅读会抛出一些你得到的东西。为了防止出现问题而无需两次读取表格,您应该自己读取所有行并自己进行计数。您的 DB-Wrapper 中应该有方法(例如抛出的异常或状态),您可以在其中检查光标是否已用尽。

    当我正确理解您的 DB-Wrapper 时,其中一个可能是问题所在。

    【讨论】:

    • 我必须添加对 moveNext() 的调用。非常感谢!
    【解决方案2】:

    在读取值之前,您需要使用 c.moveToNext() 将光标移动到第一行:

    public String getEntry(long rowIndex) {
        String value = "";
    
        Cursor c = db.query(DATABASE_TABLE, new String[] { KEY_NAME, VALUE },
                KEY_NAME + "=" + rowIndex, null, null, null, null);
    
        int columnIndex = c.getColumnIndex(VALUE);
        if (c.moveToNext()) {
            value = c.getString(columnIndex);
        }
    
        return value;
    }
    

    【讨论】:

      【解决方案3】:

      我有一个之前创建的数据库。它有两个字段名称,num。

      当我想使用游标从该数据库中检索数据时,出现了一些错误。 但我可以从返回的游标中使用 getCount() 计算 d 行 这是我的代码:

       Cursor c=myDB.query(MY_DATABASE_TABLE,null,null,null,null,null,null);
        Log.d("cursor",Integer.toString(c.getCount()));
      
        if (c.moveToFirst())
       {
      
      do{
             String data = c.getString(c.getColumnIndex("name"));
      
                        Log.v("yo",data);
      
                     }while(c.moveToNext());
      
      }
      

      Error is bad request for field slot 0,-1 numrows =5,numcolumns =2

      【讨论】: