2015-05-14 2 views
0

Я пытаюсь составить список контактов, имеющих электронную почту, телефон или и то, и другое. Для этой цели я использую ContentResolver с URI установлен ContactsContract.Data.CONTENT_URI и я выбираю из этих условий:Свяжитесь с нами, у которых есть адрес электронной почты или номер телефона с уникальными результатами

String SELECTION = ContactsContract.Data.DISPLAY_NAME_PRIMARY + "<>'' AND " + ContactsContract.Data.IN_VISIBLE_GROUP + "=1" + " AND (" + ContactsContract.Data.MIMETYPE + "=? OR " + ContactsContract.Data.MIMETYPE + "=?)"; 
String[] SELECTION_ARGS = new String[]{ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE, 
       ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE}; 

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

Есть ли способ ОТЛИЧИТЬ эти записи? Я использую CursorLoaderManager с CursorAdapter (может быть, только способ - отфильтровать их при завершении загрузки?).

+0

Вы видели [это] (http://stackoverflow.com/questions/2315203/android-distinct-and-groupby-in-contentresolver), это немного старый, но может быть полезным. –

+0

Я пробовал все, но, к сожалению, ничего не помогает из-за того, что эти «хаки» были исправлены в последних версиях Android или они не работают с поставщиками контактных материалов:/ – bakua

ответ

0

Используйте следующий код.

ContentResolver cr = context.getContentResolver(); 
    String[] PROJECTION = new String[] { ContactsContract.RawContacts._ID, 
      ContactsContract.CommonDataKinds.Phone.NUMBER, 
      ContactsContract.CommonDataKinds.Email.DATA, 
      ContactsContract.CommonDataKinds.Photo.CONTACT_ID }; 
    String order = "CASE WHEN " 
      + ContactsContract.CommonDataKinds.Phone.NUMBER 
      + " NOT LIKE '%@%' THEN 1 ELSE 2 END, " 
      + ContactsContract.Contacts.NUMBER 
      + ", " 
      + ContactsContract.CommonDataKinds.Email.DATA 
      + " COLLATE NOCASE"; 
    String filter = ContactsContract.CommonDataKinds.Email.DATA + " NOT LIKE ''"; 
    Cursor cur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, PROJECTION, filter, null, order); 
+0

ContactsContract.Contacts.NUMBER не существует. Вы имеете в виду ContactsContract.CommonDataKinds.Phone.NUMBER? – bakua

+0

см. Обновленный ответ –

+0

Но все же это не исключает дублирования записей из результата выбора. – bakua