Android; У меня только 2 контакта, но я могу получить 5 из запроса, почему? - PullRequest
0 голосов
/ 28 августа 2010

В моем эмуляторе настроено 2 тестовых контакта.

Я выполняю следующий запрос, он должен выбрать их оба, заполнить объект моего домена и добавить в список. Поэтому выход внизу должен быть 2, но это 5, почему это? (cursor.getCount () равен 5 вместо 2)

Я прошел каждую итерацию цикла while, и он получал один и тот же контакт несколько раз, но с разными значениями для POSTCODE, например номером телефона

ContentResolver cr = getContentResolver();
        Cursor cursor = cr.query(ContactsContract.Data.CONTENT_URI,
                null, null, null, null);
        List<MeCercanaContact> contacts = new ArrayList<MeCercanaContact>();
        if (cursor.getCount() > 0)
        {
            while (cursor.moveToNext())
            {
                MyContact myContact = new MyContact();
                String givenName = cursor.getString(cursor.getColumnIndex(
                        ContactsContract.Contacts.DISPLAY_NAME));
                String postcode = cursor.getString(cursor.getColumnIndex(
                        ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE));
                myContact.setFirstName(givenName);
                myContact.setLastName(postcode);
                contacts.add(myContact);
            }
        }
        System.out.println(contacts.size());

Ответы [ 3 ]

2 голосов
/ 04 мая 2019

После API 21 мы пишем этот запрос для удаления дубликатов контактов.

String select = ContactsContract.Data.HAS_PHONE_NUMBER + " != 0 AND " + 
ContactsContract.Data.MIMETYPE
                + " = " + ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE + " 
AND "+ ContactsContract.Data.RAW_CONTACT_ID + " = " + 
ContactsContract.Data.NAME_RAW_CONTACT_ID;

Cursor cursor = mContent.query(ContactsContract.Data.CONTENT_URI, null, select, 
 null, null);
1 голос
/ 28 августа 2010

Вы запрашиваете ContactsContract.Data, который является универсальным контейнером, который содержит список различных контактных данных, таких как номера телефонов, почтовые индексы и т. Д. Вы должны фильтровать результаты для строк, столбец ContactsContract.Data.MIMETYPE которых равенStructuredPostal.CONTENT_ITEM_TYPE:

Поэтому измените запрос на:

Cursor cursor = cr.query(ContactsContract.Data.CONTENT_URI,
     null, null, ContacsContract.Data.MIMETYPE +  "='" + 
ContactsContract.StructuredPostal.CONTENT_ITEM_TYPE + "'", null);

См. ContactsContract.Data

0 голосов
/ 02 августа 2017

контакт, зарегистрированный в нескольких группах, будет отображаться несколько раз, если вы запросите Uri CONTENT_URI = ContactsContract.Data.CONTENT_URI

Добавьте это в ваш ВЫБОР:

 + ContactsContract.Data.DATA1 + " = 1 " ;  //show only contacts in group 1
...