android.la base de données.CursorIndexOutOfBoundsException: Indice de 0 a demandé, avec une taille de 0
Je suis à l'aide de la coutume adaptateur extension curseur de la carte pour afficher les données dans le contrôle listview pour afficher numéro de téléphone particulier, j'ai passé l'id à une méthode de classe de base de données, mais il est montrant
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.
C'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;
}
Vous devez vous connecter pour publier un commentaire.
Chaque fois que vous faites affaire avec des Curseurs, TOUJOURS vérifier la valeur null et vérifier
moveToFirst()
sans échec.Placez les bûches de façon appropriée afin de voir si elle est de retour
null
ou un vide curseur. Selon que l'enregistrement de votre requête.Mise à jour Mettre à la fois les chèques en une seule instruction, comme mentionné par Jon dans le commentaire ci-dessous.
Mise à jour 2 Mettre le
close()
appel à l'intérieur de l'curseur valide portée.if(cursor.getCount()!= 0)
?cursor != null
est vrai, maiscursor.movetofirst()
est faux,cursor.close()
n'obtiendrez pas atteint. Semble que vous auriez encore envie de fermer le curseur dans ce cas, et c'est une mauvaise pratique? SaufmoveToFirst()
renvoie toujours vrai?essayer ce.. ce sera d'éviter une Exception levée lorsque le curseur est vide..
if(cursor.getCount()!= 0)
?if(cursor != null && cursor.getCount()!= 0)
D'abord vérifier cette Condition avant de l'extraction de données
Vérifier la valeur de retour de
moveToFirst()
, avant d'essayer de lire quoi que ce soit à partir du curseur. Il semble que si aucun résultat n'est retourné.enregistrer un schéma de requête
Cursor
s estDans le cas où les gens sont toujours à la recherche:
Au lieu de chercher
"ContactNumber"
essayez de rechercherPhone.NUMBER
. Le tutoriel a le code avec plus de détails: http://developer.android.com/training/basics/intents/result.htmlessayez de désinstaller l'application, puis de nouveau tester... en fait la db sqlite est créé qu'une seule fois lorsque l'application est d'abord installer... donc si vous pensez que votre logique est en cours puis de réinstaller l'application va faire l'affaire pour vous. !!!!