我创建了以下方法,用于从数据库中检索存储的设置:
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应该指向一个有效的条目。
有谁知道这里可能出现什么问题?
答案 0 :(得分:4)
我不知道你使用的DB-Wrapper,但我想做两个猜测,因为我对Sqlite有点了解。
可能是:
在我的包装器和C-API中,每次要检索数据时都需要执行一步(或下一步)。您的例外情况表明您没有位于右侧。因此,您可以尝试“下一步”或“步骤”(DB-Wrapper理解的内容)。
这c.getCount()
也可能带来麻烦。 getCount可以做什么,依靠游标?它可以迭代光标直到它完成。发生这种情况时,光标会耗尽,您只能重做整个过程。在这一点上阅读会抛出你得到的东西。为了防止问题而不需要两次读取表,您应该自己读取所有行并自己进行计数。在你的DB-Wrapper中应该有一些方法(比如抛出异常或状态),你可以检查光标是否已用完。
当我理解你的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