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();
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();
}
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.
Utilisez cursor.getCount() == 0
. Si vrai, le curseur est vide
public boolean isCursorEmpty(Cursor cursor){
return !cursor.moveToFirst() || cursor.getCount() == 0;
}
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
}
System.out.println("count "+ cursor.getCount());
Cela montrera la valeur du curseur dans logcat
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.