我在我的模拟器中设置了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());
答案 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);
答案 2 :(得分:0)
注册到多个组的联系人将多次显示
如果您查询Uri CONTENT_URI = ContactsContract.Data.CONTENT_URI
将此添加到您的选择:
+ ContactsContract.Data.DATA1 + " = 1 " ; //show only contacts in group 1