55

リストビューにデータを表示するためにカーソルアダプターを拡張するカスタムアダプターを使用しています。特定の電話番号を表示するために、データベースクラスのメソッドに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;
}
4

7 に答える 7

112

カーソルを扱うときは常に、常にnullをチェックしmoveToFirst()、必ずチェックしてください。

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

nullログを適切に配置して、カーソルが戻っているか空であるかを確認します。それによると、クエリを確認してください。

更新以下のコメントでJonが述べているように、両方のチェックを1つのステートメントに入れてください。

更新2close()呼び出しを有効なカーソルスコープ内に置きます。

于 2012-04-20T10:17:45.353 に答える
22

これを試してください..これにより、カーソルが空のときにスローされる例外が回避されます..

if(cursor != null && cursor.moveToFirst()){
    num = cursor.getString(cursor.getColumnIndex("ContactNumber")); 
    cursor.close();
}
于 2012-04-20T10:13:44.083 に答える
13

データを取得する前に、まずこの条件を確認してください

if(cursor!=null && cursor.getCount()>0){
  cursor.moveToFirst();
  num = cursor.getString(cursor.getColumnIndex("ContactNumber")); 
}
于 2012-04-20T10:32:43.527 に答える
7

moveToFirst()カーソルから何かを読み取ろうとする前に、からの戻り値を確認してください。結果が返されていないようです。

于 2012-04-20T10:13:09.970 に答える
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();
}
于 2012-04-20T10:17:57.277 に答える