0

我在模拟器中设置了 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());
4

3 回答 3

2

在 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);
于 2019-05-04T04:58:21.750 回答
1

您正在查询 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

于 2010-08-28T15:33:32.597 回答
0

如果您查询已注册到多个组的联系人,则会多次显示 Uri CONTENT_URI = ContactsContract.Data.CONTENT_URI

将此添加到您的选择中:

 + ContactsContract.Data.DATA1 + " = 1 " ;  //show only contacts in group 1
于 2017-08-02T10:44:30.213 回答