2015-05-29 4 views
5

Ich bin vor diesem SQLite Problem, bei dem ich versuche, um die Kontakte zu extrahieren, die Telefonnummer/s mit der folgenden Abfrage hat:SQLite android Extrakt Kontakte mit Telefonnummer

Cursor cursor = context.getContentResolver(). 
    query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
      new String[]{ 
       ContactsContract.CommonDataKinds.Phone.CONTACT_ID, 
       ContactsContract.CommonDataKinds.Phone.NUMBER, 
       ContactsContract.Contacts.DISPLAY_NAME, 
       ContactsContract.Contacts.PHOTO_URI 
      }, 
      ContactsContract.Contacts.HAS_PHONE_NUMBER + ">?", 
      new String [] {"0"}, 
      ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC" 
    ); 

Das Problem ist, dass in der Fall, dass der Kontakt mehr als 1 Telefonnummer hat das Ergebnis in dieser Form sein wird:

id: 451, name: Maria, photoUri: null, has_phone_number: 1, phone_number: 0700 000 000 
id: 451, name: Maria, photoUri: null, has_phone_number: 1, phone_number: 0800 000 000 
id: 451, name: Maria, photoUri: null, has_phone_number: 1, phone_number: 0900 000 000 

die wegen der doppelten Daten unerwünscht ist.

Ich möchte nur 1 Abfrage an die DB machen, die hoffentlich geschrieben werden kann das Ergebnis wie folgt zurück:

id: 451, name: Maria, photoUri: null, has_phone_number: 1, phone_number: 0700 000 000, 0800 000 000, 0900 000 000 

Ist es möglich?

Vielen Dank.

+0

ich denke nicht, dass es möglich ist, wie android db eingerichtet ist. kommt es nicht in Frage, das in eine Liste zu setzen und sie manuell mit einer Schleife oder etwas zusammenzufügen? ich weiß, dass prob nicht ein guter Weg ist, aber ich kann nicht an einen besseren denken. –

+0

Es muss mit Kontakten im Bereich von Tausenden arbeiten, möchte ich vermeiden, zusätzliche Verarbeitung zu tun. –

+0

Ich kenne Android nicht, aber das ist nicht zu schwer in SQL zu tun. Können Sie jedoch rohe SQL-Abfragen für Ihre Datenbank ausführen oder sind Sie darauf beschränkt, diese Abfragefunktion zu verwenden? –

Antwort

0

Ich glaube nicht, ist möglich, was Sie tun möchten, Dies ist eine Problemumgehung mit einer HashMap. Es kann Tausende von Einträgen verarbeiten, also keine Sorge.

Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
      new String[]{ ContactsContract.CommonDataKinds.Phone.CONTACT_ID, 
        ContactsContract.CommonDataKinds.Phone.NUMBER, 
        ContactsContract.Contacts.DISPLAY_NAME, 
        ContactsContract.Contacts.PHOTO_URI }, 
      ContactsContract.Contacts.HAS_PHONE_NUMBER + ">?", 
      new String [] {"0"}, 
      ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC"); 

    Map<String, List<String>> phonesPerContact = new HashMap<>(); 
    if (cursor.moveToFirst()) { 
     do { 
      String name = cursor.getString(2); 
      String phone = cursor.getString(1); 

      if (!phonesPerContact.containsKey(name)){ 
       phonesPerContact.put(name, new ArrayList<String>()); 
      } 

      phonesPerContact.get(name).add(phone); 
     } while (cursor.moveToNext()); 
    } 

    for (String name: phonesPerContact.keySet()){ 
     //Do whatever you want with the contact and its list of phones 

     List<String> phones = phonesPerContact.get(name); 
     Log.i("test", "Name: " + name + ", Numbers: " + phones.toString()); 
    } 
+0

Ein Kommentar über den Downvote wird geschätzt. – omainegra

+0

Danke für einen Stich (+1), ich muss sehen, welche Implementierung ich am Ende wählen werde. –