Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database Android:从数据库检索数据问题_Database_Android_Sqlite - Fatal编程技术网

Database Android:从数据库检索数据问题

Database Android:从数据库检索数据问题,database,android,sqlite,Database,Android,Sqlite,我创建了以下从数据库检索存储设置的方法: 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(VAL

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

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,它应该指向一个有效的条目


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

我不知道您使用的DB包装器,但我想做两个猜测,因为我对Sqlite有点了解

它可以是:

  • 在我的包装器和C-API中,每次需要检索数据时都需要执行一个步骤(或下一步)。您的异常表明您未定位在正确的行。因此,您可以尝试“下一步”或“下一步”(DB包装器所理解的)

  • c.getCount()
    也可能带来麻烦。getCount可以做什么,在光标上计数?它可以迭代光标直到完成。当这种情况发生时,光标将耗尽,您只能重做整个操作。在这一点上阅读会让你失去一些东西。为了避免这个问题而不需要读取两次表,您应该自己读取所有行,然后自己进行计数。DB包装器中应该有一些方法(比如抛出异常或状态),您可以在其中检查游标是否已用尽


  • 当我正确理解DB包装器时,其中一个可能就是问题所在。

    在读取值之前,需要使用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;
    }
    

    我在前面创建了一个数据库,它有两个字段名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());
    
    }
    

    错误是对字段插槽0的错误请求,-1 numrows=5,numcolumns=2

    我必须添加对moveNext()的调用。太多了!