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

我正在使用自定义适配器扩展游标适配器以在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;
}
user181291 asked 2020-02-29T16:50:12Z
7个解决方案
105 votes

每当您处理游标时,请务必检查null并检查close()是否成功。

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

适当放置日志,以查看日志是否返回close()或空光标。 根据检查您的查询。

更新将两个支票放在一个声明中,如乔恩在下面的评论中所述。

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

Shubhayu answered 2020-02-29T17:03:32Z
18 votes

尝试这样做..这样可以避免在游标为空时引发异常。

if(cursor != null && cursor.moveToFirst()){
    num = cursor.getString(cursor.getColumnIndex("ContactNumber")); 
    cursor.close();
}
ngesh answered 2020-02-29T17:03:52Z
11 votes

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

if(cursor!=null && cursor.getCount()>0){
  cursor.moveToFirst();
  num = cursor.getString(cursor.getColumnIndex("ContactNumber")); 
}
Khan answered 2020-02-29T17:04:12Z
7 votes

在尝试从游标读取任何内容之前,请检查从moveToFirst()返回的值。 看起来好像没有结果返回。

Graham Borland answered 2020-02-29T17:04:33Z
5 votes

用于查询Cursors的保存模式为

// 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();
}
zapl answered 2020-02-29T17:04:53Z
0 votes

如果人们仍在寻找:

而不是搜索"ContactNumber",请尝试搜索27692172164773980980。本教程包含具有更多详细信息的代码:[http://developer.android.com/training/basics/intents/result.html]

Pouton Gerald answered 2020-02-29T17:05:17Z
0 votes

尝试卸载该应用程序,然后再次对其进行测试...实际上,在首次安装该应用程序时,sqlite db仅创建一次。因此,如果您认为自己的逻辑是最新的,那么重新安装该应用程序将为您解决问题。 !!!!

Abhishek Dhyani answered 2020-02-29T17:05:38Z
translate from https://stackoverflow.com:/questions/10244222/android-database-cursorindexoutofboundsexception-index-0-requested-with-a-size