2015-05-29 37 views
5

Jestem w obliczu tego problemu sqlite w którym staram się wydobyć kontakty, które mają numer telefonu/sz następującym zapytaniem:SQLite android kontakty wyekstrahować numer telefonu

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" 
    ); 

Problem polega na tym, że w zdarza się, że kontakt ma więcej niż 1 numer telefonu wynik będzie w tej postaci:

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 

co jest niepożądane ze względu na duplikatów danych.

chcę zrobić tylko 1 zapytanie do db z nadzieją, że może być napisane, aby powrócić wynik tak:

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

jest to możliwe?

Dziękuję.

+0

Nie sądzę, że jest to możliwe, jak konfiguruje się Android db. czy nie można umieścić go na liście i łączyć ręcznie za pomocą pętli lub czegoś podobnego? Wiem, że to nie jest dobry sposób, ale nie mogę myśleć o lepszym. –

+0

Musi pracować z kontaktami w zakresie tysięcy, chciałbym uniknąć dodatkowego przetwarzania. –

+0

Nie znam Androida, ale nie jest to zbyt trudne w SQL. Czy możesz jednak uruchamiać surowe zapytania SQL w bazie danych lub czy korzystanie z tej funkcji jest ograniczone? –

Odpowiedz

0

Nie sądzę, że jest to możliwe, co chcesz zrobić. Jest to obejście z użyciem HashMap. Może obsłużyć tysiące wpisów, więc nie martw się.

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

Zostanie doceniony komentarz na temat spadkobiercy. – omainegra

+0

Thx za zabicie go (+1), będę musiał zobaczyć, jaką implementację wybiorę na końcu. –