Android的;我只有2个联系人,但我可以从查询中获得5个,为什么?

时间:2010-08-27 22:37:34

标签: android cursor contacts android-2.2-froyo

我在我的模拟器中设置了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 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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

答案 2 :(得分:0)

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

将此添加到您的选择:

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