我正在使用自定义适配器扩展游标适配器在listview中显示数据,以显示我已将id传递给数据库类中的方法的特定电话号码但是它正在显示
errorandroid.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
将调试器放在方法中时它不在行
之后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;
}
答案 0 :(得分:105)
每当你处理游标时,总是检查空值并检查moveToFirst()
。{/ p>
if( cursor != null && cursor.moveToFirst() ){
num = cursor.getString(cursor.getColumnIndex("ContactNumber"));
cursor.close();
}
正确放置日志以查看它是返回null
还是空光标。根据检查你的查询。
更新将这两项检查放在Jon在下面的评论中提到的单个语句中。
更新2 将close()
调用放在有效的游标范围内。
答案 1 :(得分:18)
尝试这个..这将避免在光标为空时抛出异常..
if(cursor != null && cursor.moveToFirst()){
num = cursor.getString(cursor.getColumnIndex("ContactNumber"));
cursor.close();
}
答案 2 :(得分:11)
首先在获取数据之前检查此条件
if(cursor!=null && cursor.getCount()>0){
cursor.moveToFirst();
num = cursor.getString(cursor.getColumnIndex("ContactNumber"));
}
答案 3 :(得分:7)
在尝试从光标读取任何内容之前,检查moveToFirst()
的返回值。看起来好像没有返回任何结果。
答案 4 :(得分:5)
查询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();
}
答案 5 :(得分:0)
如果人们还在寻找:
尝试搜索"ContactNumber"
,而不是搜索Phone.NUMBER
。本教程的代码包含更多详细信息:http://developer.android.com/training/basics/intents/result.html
答案 6 :(得分:0)
尝试卸载该应用程序,然后再次对其进行测试...实际上,在首次安装该应用程序时,sqlite数据库仅创建一次...因此,如果您认为自己的逻辑是最新的,那么重新安装该应用程序将为您解决问题您。 !!!!