web-dev-qa-db-fra.com

android.database.CursorIndexOutOfBoundsException: Index demandé, avec une taille de

J'utilise un adaptateur personnalisé étendant l'adaptateur de curseur pour afficher des données dans une liste, afin d'afficher un numéro de téléphone particulier, j'ai transmis l'identifiant à une méthode de la classe de base de données, mais elle affiche 

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

tout en plaçant le débogueur dans la méthode, il ne va pas après la ligne

num = cursor.getString(cursor.getColumnIndex("ContactNumber"));

Quelqu'un peut-il m'aider à le résoudre ..__ Ceci est le code:

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

Chaque fois que vous traitez avec des curseurs, vérifiez TOUJOURS la valeur null et vérifiez la fonction moveToFirst() sans échec.

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

Placez les journaux de manière appropriée pour voir si elle renvoie null ou un curseur vide. Selon cette vérification, votre requête.

Mise à jour Mettez les deux chèques dans une seule déclaration, comme mentionné par Jon dans le commentaire ci-dessous. 

Mise à jour 2 Placez l'appel close() dans la portée du curseur valide.

102
Shubhayu

essayez ceci .. ceci évitera qu'une exception ne soit levée quand le curseur est vide ..

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

Commencez par vérifier cette condition avant de récupérer des données 

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

Vérifiez la valeur de retour de moveToFirst() avant d'essayer de lire quoi que ce soit à partir du curseur. Il semble qu'aucun résultat ne soit renvoyé.

7
Graham Borland

un schéma de sauvegarde pour interroger Cursors est

// 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

essayez de désinstaller l'application, puis testez-la à nouveau ... en fait, la base de données sqlite n'est créée qu'une fois lors de la première installation de l'application ... donc, si vous pensez que votre logique est actuelle, la réinstallation de l'application fera l'affaire pour vous. !!!!

0
Abhishek Dhyani

Si les gens cherchent encore:

Au lieu de rechercher "ContactNumber", essayez de rechercher Phone.NUMBER. Le tutoriel contient le code avec plus de détails: http://developer.Android.com/training/basics/intents/result.html

0
Pouton Gerald