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;
}
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.
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();
}
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"));
}
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é.
un schéma de sauvegarde pour interroger Cursor
s 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();
}
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. !!!!
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