2015-05-29 29 views
5

sto affrontando questo problema SQLite in cui sto cercando di estrarre i contatti che hanno il numero di telefono/s con la seguente query:SQLite contatti estratto Android con numero di telefono

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

Il problema è che in il caso che il contatto ha più di 1 numero telefonico il risultato sarà in questa forma:

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 

che è indesiderabile a causa dei dati duplicati.

Voglio fare solo 1 interrogazione al db che si spera possa essere scritto per riportare il risultato come questo:

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

E 'possibile?

Grazie.

+0

Non penso sia possibile il modo in cui Android db è impostato. è fuori questione mettere questo in un elenco e unirli manualmente con un ciclo o qualcosa del genere? So che il problema non è un buon modo, ma non posso pensare a uno migliore. –

+0

Ha bisogno di lavorare con i contatti nel raggio di migliaia, vorrei evitare di fare un'ulteriore elaborazione. –

+0

Non conosco Android, ma questo non è troppo difficile da fare in SQL. Puoi eseguire query SQL raw sul tuo database, o sei limitato ad usare quella funzione di query? –

risposta

0

Non penso sia possibile ciò che si vuole fare, Questa è una soluzione alternativa che utilizza una HashMap. Può gestire migliaia di voci, quindi non preoccuparti.

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

Un commento sul downvote sarà apprezzato. – omainegra

+0

Thx per esservi accoltellato (+1), dovrò vedere quale implementazione sceglierò alla fine. –