2013-02-21 24 views
18

Wenn ich versuche, die Telefonnummern aus der Kontaktliste des Telefons zu bekommen. Das Problem ist, wenn die App ausgeführt wird, während die Kontaktliste im Telefon leer ist, wird die App gestoppt. Ich habe es überprüft, weil der Cursor leer ist.Wie überprüft man, ob ein Cursor leer ist?

Wie kann ich überprüfen, ob der Cursor leer ist oder ob Kontakte in der Kontaktliste des Telefons vorhanden sind?

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(); 
+0

Entfernen Sie die Anrufe von phones.moveToFirst() und 1stPhonenumber.add. Verlassen Sie Ihre while-Schleife. Fest. – dymmeh

+0

Versuchen Sie auch, eine Projektion der Spalten zu übergeben, nach denen Sie suchen. Verwenden Sie nicht alle Spalten (durch die Null für die Projektion), wenn Sie nur 1. – dymmeh

Antwort

8

Ich habe in einer Projektion hinzugefügt, so dass Sie nur die Spalte erhalten, die Sie benötigen.

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(); 
} 
+0

Dies ist der Buchstabe L :) –

+0

Oh haha ​​.. ich kann nicht lesen :) – dymmeh

+0

Danke Das hat perfekt funktioniert! –

21

Verwenden Sie cursor.getCount() == 0. Wenn wahr, ist der Cursor leer

4

Versuchen Sie diesen. Das Problem Ihres Codes besteht darin, dass er unabhängig von der Länge des Cursors Add ausführt. Ich schließe die phones.moveToFirst() in der if-Anweisung ein, da sie false zurückgibt, wenn der Cursor leer ist oder keinen Datensatz enthält.

+0

Oder nur eine while-Schleife .. Hinzufügen der zusätzlichen wenn zusammen mit tun/während sieht hässlich und fügt sinnlose Logik – dymmeh

29

Das allgemeine Muster für ein „gültig“ Cursor zu testen, ist

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

Die Kontakte Provider nicht null zurückgibt, aber auch andere Content-Provider können so tun, wenn sie irgendeine Art von Datenfehler auftreten . Ein Inhaltsanbieter sollte Exceptions behandeln, setzen Sie den Cursor auf Null und protokollieren Sie die Ausnahme, aber es gibt keine Garantie.

4
public boolean isCursorEmpty(Cursor cursor){ 
    return !cursor.moveToFirst() || cursor.getCount() == 0; 
} 
1
cursor.moveToFirst(); 
if (cursor.isBeforeFirst()) //means empty result set 
     ; //do your stuff when cursor is empty 

isBeforeFirst() nach moveToFirst() auch gut funktioniert.

Nach der Cursor documentation:

isBeforeFirst(): Gibt an, ob sich der Cursor vor der ersten Zeile auf die Position zeigt.

Verwandte Themen