安卓数据库问题描述
我正在使用扩展自游标适配器(curosr adapter)的自定义适配器,在列表视图(listview)中显示数据,实际显示的数据是特定的电话号码。我已经把id传递给了数据库类中的方法,但系统报错:
errorandroid.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
如果在方法中设置调试器(debugger),但是不会运行到这一行之后:
num = cursor.getString(cursor.getColumnIndex("ContactNumber"));
这是主要相关代码:
public String getNumberFromId(int id)
{
String num;
db= this.getReadableDatabase();
Cursor cursor = db.query(scheduletable, new String[] { "ContactNumber" },"_id="+id, null, null, null, null);
cursor.moveToFirst();
num = cursor.getString(cursor.getColumnIndex("ContactNumber"));
cursor.close();
db.close();
return num;
}
这个问题到底要怎么解决呢?
推荐的解决方法
每当您要处理游标时,始终都必须检查cursor为是否null,并且要检查moveToFirst()
是否执行成功。如下面的代码所示:
if( cursor != null && cursor.moveToFirst() ){
num = cursor.getString(cursor.getColumnIndex("ContactNumber"));
cursor.close();
}
可以适当地打印日志查看是否返回null
或空的游标。根据日志情况,如果发现有问题,再检查下cursor查询操作是否正确。
注意1:考虑到“C1 && C2”符号执行时,前面的条件C1返回True才会执行后面的条件C2,所以把 cursor != null && cursor.moveToFirst()
写在一起更简洁高效
注意2:游标的close()
调用也应该在cursor有效时才能执行。
次佳解决办法
在获取数据之前需要先对cursor
检查如下的条件:
if(cursor!=null && cursor.getCount()>0){
cursor.moveToFirst();
num = cursor.getString(cursor.getColumnIndex("ContactNumber"));
}
第三种解决思路
在您尝试从游标读取任何数据之前,请先检查游标moveToFirst()
的返回值。题主的问题看起来是因为好像没有返回任何结果。
正确的示例代码
Cursor
查询和保存的示例代码
// just one,单列
Cursor cursor = db.query(...);
if (cursor != null) {
if (cursor.moveToFirst()) {
value = cursor.getSomething();
}
cursor.close();
}
// multiple columns, 多列的情形
Cursor cursor = db.query(...);
if (cursor != null) {
while (cursor.moveToNext()) {
values.add(cursor.getSomething());
}
cursor.close();
}
数据库游标执行moveToNext()
示意图: