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

use*_*291 47 database android cursor

我正在使用自定义适配器扩展游标适配器在listview中显示数据,以显示我已将id传递给数据库类中的方法的特定电话号码但它正在显示

errorandroid.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0 
Run Code Online (Sandbox Code Playgroud)

将调试器放在方法中时,它不会在行之后

num = cursor.getString(cursor.getColumnIndex("ContactNumber"));
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我解决它.这是代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

Shu*_*ayu 105

无论何时处理游标,总是检查null并检查是否正确moveToFirst().

if( cursor != null && cursor.moveToFirst() ){
    num = cursor.getString(cursor.getColumnIndex("ContactNumber"));
    cursor.close(); 
}
Run Code Online (Sandbox Code Playgroud)

适当地放置日志以查看它是返回null还是空光标.根据那个检查你的查询.

更新将两个检查放在Jon在下面的注释中提到的单个语句中.

更新2close()调用置于有效的游标范围内.

  • 如果`cursor!= null`为true,但是`cursor.movetofirst()`为false,则不会到达`cursor.close()`.在这种情况下,你似乎仍然希望关闭光标,这是不好的做法?除非`moveToFirst()`总是返回true? (2认同)

nge*_*esh 18

尝试这个..这将避免在光标为空时抛出异常..

if(cursor != null && cursor.moveToFirst()){
    num = cursor.getString(cursor.getColumnIndex("ContactNumber")); 
    cursor.close();
}
Run Code Online (Sandbox Code Playgroud)

  • 如果cursor为null,则此代码将在cursor.close()上崩溃. (2认同)

Kha*_*han 11

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

if(cursor!=null && cursor.getCount()>0){
  cursor.moveToFirst();
  num = cursor.getString(cursor.getColumnIndex("ContactNumber")); 
}
Run Code Online (Sandbox Code Playgroud)


Gra*_*and 7

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


zap*_*apl 5

查询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();
}
Run Code Online (Sandbox Code Playgroud)