web-dev-qa-db-fra.com

Comment vérifier si un curseur est vide?

Lorsque j'essaie d'obtenir les numéros de téléphone de la liste de contacts du téléphone. Le problème est que lorsque j'exécute l'application alors que la liste de contacts du téléphone est vide, l'application est arrêtée. Je l'ai vérifié et c'est parce que le curseur est vide.

Comment puis-je vérifier si le curseur est vide ou s'il y a des contacts dans la liste de contacts du téléphone?

ArrayList<String> lstPhoneNumber = new ArrayList<String>();
Cursor phones = getContentResolver().query(
        ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null); 
lstPhoneNumber = new ArrayList<String>();

phones.moveToFirst();
// The problematic Line:
lstPhoneNumber.add(phones.getString(phones.getColumnIndex(
        ContactsContract.CommonDataKinds.Phone.NUMBER))); 
while (phones.moveToNext()) {
    lstPhoneNumber.add(phones.getString(phones.getColumnIndex(
            ContactsContract.CommonDataKinds.Phone.NUMBER))); 
}
phones.close();
23
Yossi Zloof

J'ai ajouté une projection afin que vous n'obteniez que la colonne dont vous avez besoin.

String[] projection = new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER };
ArrayList<String> lstPhoneNumber = new ArrayList<String>();
Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
        projection, null, null, null);
if (phones == null)
    return; // can't do anything with a null cursor.
try {
    while (phones.moveToNext()) {
        lstPhoneNumber.add(phones.getString(0));
    }
} finally {
    phones.close();
}
9
dymmeh

Le modèle général pour tester un curseur "valide" est

((cursor != null) && (cursor.getCount() > 0))

Le fournisseur de contacts ne renvoie pas null, mais d'autres fournisseurs de contenu peuvent le faire s'ils rencontrent une sorte d'erreur de données. Un fournisseur de contenu devrait gérer les exceptions, mettre le curseur à zéro et enregistrer l'exception, mais il n'y a aucune garantie.

44
Joe Malin

Utilisez cursor.getCount() == 0. Si vrai, le curseur est vide

24
Gabe Sechan
public boolean isCursorEmpty(Cursor cursor){
   return !cursor.moveToFirst() || cursor.getCount() == 0;
}
4
Cao Manh Dat

Essaye celui-là. Le problème de votre code est qu'il exécutera l'ajout indépendamment de la longueur du curseur. J'inclus les téléphones.moveToFirst () dans l'instruction if car elle renverra false si le curseur est vide ou n'a aucun enregistrement.

  if(phones.moveToFirst()){
       do{
          lstPhoneNumber.add(phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); 
        }while(phones.moveToNext())
   } else {
        //do something else
   }
4
Ariel Magbanua
System.out.println("count "+ cursor.getCount());

Cela montrera la valeur du curseur dans logcat

1
Abhay Pratap
cursor.moveToFirst();
if (cursor.isBeforeFirst()) //means empty result set
        ; //do your stuff when cursor is empty

isBeforeFirst() après une moveToFirst() fonctionne bien aussi.

Selon le documentation du curseur :

isBeforeFirst (): retourne si le curseur pointe vers la position avant la première ligne.

1
Christopher J.