Получение всех контактов хотя бы с одним адресом электронной почты (DISTINCT)

Я пишу ContactPickerDialog для пользовательских предпочтений.

В зависимости от предпочтения в ContactPickerDialog должны отображаться все контакты с хотя бы одним номером телефона или все контакты с хотя бы одним адресом электронной почты. Ни один контакт не должен отображаться дважды, независимо от того, сколько телефонных номеров или адресов электронной почты связано с этим контактом.

У меня нет проблем с получением всех контактов хотя бы с одним номером телефона, так как я могу использовать HAS_PHONE_NUMBER в предложении где. Но я понятия не имею, как получить контакты по крайней мере с одним адресом электронной почты, не получая несколько контактов несколько раз, если они имеют более одного адреса электронной почты.

Это мой код:

public void LoadContactsWithTarget(Context context, PickContactDialog.PickTarget pickTarget)
{
    try
    {
        String[] projection = new String[] 
        {
            ContactsContract.Contacts.DISPLAY_NAME,
            ContactsContract.Contacts.PHOTO_THUMBNAIL_URI,
            ContactsContract.Contacts.PHOTO_URI,
            ContactsContract.Contacts._ID
        };

    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " ASC";

    Uri uri = null;
    String where = "";
    if (pickTarget == PickTarget.PHONE_NR)
    {
        // works great, I only get one contact, no matter how many phone-numbers are connected with this contact
        uri = ContactsContract.Contacts.CONTENT_URI;
        where = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = 1";
    }
    else if (pickTarget == PickTarget.EMAIL)
    {
        // I get one contact/entry for each eMail-address that is connected with the contact but I only want to get one contact, no matter how many eMail-addresse are connected with the contact
        uri = ContactsContract.CommonDataKinds.Email.CONTENT_URI;
        where = ContactsContract.CommonDataKinds.Email.DATA + " NOT LIKE ''";               
    }

    Cursor cursor = context.getContentResolver().query(uri, projection, where, null, sortOrder);

    if (cursor.moveToFirst())
    {
        int iNameColumn      = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
        int iThumbnailColumn = cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_THUMBNAIL_URI);
        int iImageColumn     = cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_URI);              
        int iIDColumn        = cursor.getColumnIndex(ContactsContract.Contacts._ID);

        while (!cursor.isAfterLast()) 
        {
            Contact contact = new Contact(cursor.getInt(iIDColumn),
                                          cursor.getString(iNameColumn),
                                          cursor.getString(iThumbnailColumn),
                                          cursor.getString(iImageColumn));

            _lstContacts.add(contact);

            cursor.moveToNext();
        }
    }

    cursor.close();
}
catch(Exception e) { }
}   

Любая помощь очень ценится

1 ответ

            cursorContacts = contentResolver.query(ContactsContract.Data.CONTENT_URI,
                    new String[]{ContactsContract.Data.CONTACT_ID,
                                 ContactsContract.Contacts.DISPLAY_NAME,
                                 ContactsContract.Data.MIMETYPE,
                                 ContactsContract.Contacts.Data.DATA1},
                    "("+ContactsContract.RawContacts.Data.MIMETYPE + "=?"
                       +" OR "+ContactsContract.RawContacts.Data.MIMETYPE + "=?)"
                    +" AND "+ContactsContract.Data.CONTACT_ID
                            +" IN (SELECT "+ContactsContract.Data.CONTACT_ID
                                  +" FROM view_data"
                                    +" WHERE "+ContactsContract.Data.MIMETYPE+"=?"
                                              +" AND "+ContactsContract.Contacts.Data.DATA1+" NOT NULL"
                                              +" AND "+ContactsContract.Contacts.Data.DATA1+" NOT LIKE ''"
                            +")"
                    ,
                    new String[]{ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE,
                                 ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE,
                                 ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE,
                                 },
                    ContactsContract.Contacts.DISPLAY_NAME);
Другие вопросы по тегам