web-dev-qa-db-ja.com

android.database.CursorIndexOutOfBoundsException:要求されたインデックス0、サイズ0

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

カーソルを扱うときは常に、常にnullをチェックし、moveToFirst()を必ずチェックします。

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

ログを適切に配置して、nullまたは空のカーソルを返しているかどうかを確認します。それに応じて、クエリを確認してください。

更新以下のコメントでJonが言及したように、両方のチェックを1つのステートメントに入れます。

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

105
Shubhayu

これを試してください。これは、カーソルが空のときに例外がスローされるのを防ぎます。

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

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

if(cursor!=null && cursor.getCount()>0){
  cursor.moveToFirst();
  num = cursor.getString(cursor.getColumnIndex("ContactNumber")); 
}
11
Khan

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

7
Graham Borland

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

アプリをアンインストールしてからもう一度テストしてみてください...実際にアプリが最初にインストールされたときに一度だけsqlite dbが作成されるので、ロジックが最新であると思われる場合は、アプリを再インストールするとうまくいきます。 !!!!

0
Abhishek Dhyani

まだ人々が見ている場合:

"ContactNumber"を検索する代わりに、Phone.NUMBERを検索してみてください。チュートリアルには、詳細が記載されたコードがあります。 http://developer.Android.com/training/basics/intents/result.html

0
Pouton Gerald