android.database.CursorIndexOutOfBoundsException:索引0请求,大小为0

我正在使用自定义适配器扩展游标适配器在列表视图中显示数据,以显示特定的电话号码我已经通过ID到数据库类中的方法,但它显示

errorandroid.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0 

而将debugging器放在方法中不会在行之后

 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; } 

每当你处理游标时,总是检查null并检查moveToFirst()而不失败。

 if( cursor != null && cursor.moveToFirst() ){ num = cursor.getString(cursor.getColumnIndex("ContactNumber")); cursor.close(); } 

正确放置日志以查看它是否返回null或空游标。 根据那个检查你的查询。

更新在下面的评论中,把两个支票放在Jon所提到的一个陈述中。

更新2close()调用放在有效的游标范围内。

试试这个..这将避免当游标为空时引发exception。

 if(cursor != null && cursor.moveToFirst()){ num = cursor.getString(cursor.getColumnIndex("ContactNumber")); cursor.close(); } 

在获取数据之前首先检查这个条件

 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(); } 

如果人们还在寻找:

而不是search"ContactNumber"尝试searchPhone.NUMBER 。 本教程包含更多细节的代码: http : //developer.android.com/training/basics/intents/result.html