Андроид; У меня всего 2 контакта, а по запросу могу получить 5, почему?

Я установил 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());

person Jimmy    schedule 27.08.2010    source источник


Ответы (3)


Вы запрашиваете 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.

person Thorstenvv    schedule 28.08.2010

После 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);
person Parveen    schedule 04.05.2019

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

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

 + ContactsContract.Data.DATA1 + " = 1 " ;  //show only contacts in group 1
person Dan Alboteanu    schedule 02.08.2017