2016-08-27 2 views
1

Ich habe viele Beiträge durchgelesen, aber keine Antwort gefunden, die die Frage effizient oder sogar richtig beantwortet. Die nächste, die ich kam, war diese How to avoid duplicate contact name (data) while loading contact info to listview?, aber das hat zu viel Aufwand. Gibt es eine einfachere oder effizientere Lösung?Android: Doppelte Kontaktdaten beim Abrufen von Kontakten mit ContactsContract.CommonDataKinds.Phone

+0

Versuchen Sie, doppelte Telefonnummern zu vermeiden, oder doppelte Kontaktnamen? Ein einzelner Kontakt könnte mehrere Telefonnummern haben, daher würde für jede dieser Nummern derselbe Anzeigename aufgeführt. –

+0

Ich weiß über das, aber das Problem ist, dass es mir die doppelten Nummern gibt. –

+0

Ok, ich hatte das gleiche Problem, das du dann gemacht hast! Lass es mich wissen, wenn meine Antwort hilft. –

Antwort

8

Ich hatte das gleiche Problem, das Sie hatten: Ich bekam doppelte Telefonnummern. Ich löste dieses Problem, indem ich die normalisierte Zahl für jeden Cursor-Eintrag erhielt und HashSet verwendete, um zu verfolgen, welche Zahlen ich bereits gefunden hatte. Versuchen Sie Folgendes:

private void doSomethingForEachUniquePhoneNumber(Context context) { 
    String[] projection = new String[] { 
      ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, 
      ContactsContract.CommonDataKinds.Phone.NUMBER, 
      ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER, 
      //plus any other properties you wish to query 
    }; 

    Cursor cursor = null; 
    try { 
     cursor = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, null, null, null); 
    } catch (SecurityException e) { 
     //SecurityException can be thrown if we don't have the right permissions 
    } 

    if (cursor != null) { 
     try { 
      HashSet<String> normalizedNumbersAlreadyFound = new HashSet<>(); 
      int indexOfNormalizedNumber = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER); 
      int indexOfDisplayName = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME); 
      int indexOfDisplayNumber = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); 

      while (cursor.moveToNext()) { 
       String normalizedNumber = cursor.getString(indexOfNormalizedNumber); 
       if (normalizedNumbersAlreadyFound.add(normalizedNumber)) { 
        String displayName = cursor.getString(indexOfDisplayName); 
        String displayNumber = cursor.getString(indexOfDisplayNumber); 
        //haven't seen this number yet: do something with this contact! 
       } else { 
        //don't do anything with this contact because we've already found this number 
       } 
      } 
     } finally { 
      cursor.close(); 
     } 
    } 
} 
+0

es funktioniert perfekt danke für die gemeinsame Nutzung der Lösung –

+0

@ gaurav4sarma Ich bin froh, dass es Ihnen geholfen hat! –

+0

Sicher kein Problem, unterdessen könntest du bitte auch die Frage auffrischen. Dank –

Verwandte Themen