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

时间:2009-07-10 07:24:09

标签: 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(VALUE);
    int rowsCount = c.getCount();
    if(rowsCount > 0){
        String value = c.getString(columnIndex);
    }

    return value;
}

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

String value = c.getString(columnIndex);

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

有谁知道这里可能出现什么问题?

3 个答案:

答案 0 :(得分:4)

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

可能是:

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

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

  3. 当我理解你的DB-Wrapper时,其中一个可能是问题。

答案 1 :(得分: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;
}

答案 2 :(得分:2)

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

当我想使用游标从这个数据库中检索数据时,会出现一些错误。 但我可以使用返回的游标中的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