我正在尝试列出包含电子邮件,电话或两者的联系人列表。
为此,我使用ContentResolver
并将URI设置为ContactsContract.Data.CONTENT_URI
,然后根据以下条件进行选择:
String SELECTION = ContactsContract.Data.DISPLAY_NAME_PRIMARY + "<>'' AND " + ContactsContract.Data.IN_VISIBLE_GROUP + "=1" + " AND (" + ContactsContract.Data.MIMETYPE + "=? OR " + ContactsContract.Data.MIMETYPE + "=?)";
String[] SELECTION_ARGS = new String[]{ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE,
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE};
我只对此类联系人的姓名感兴趣。但是因为数据表在给定的行中保存给定联系人的每个信息,所以结果游标中有重复的条目。
有没有办法如何区分这些条目?我正在使用CursorLoaderManager
和CursorAdapter
(也许唯一的方法就是在加载程序完成后将它们过滤掉来。)。
答案 0 :(得分:0)
使用以下代码。
ContentResolver cr = context.getContentResolver();
String[] PROJECTION = new String[] { ContactsContract.RawContacts._ID,
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.CommonDataKinds.Email.DATA,
ContactsContract.CommonDataKinds.Photo.CONTACT_ID };
String order = "CASE WHEN "
+ ContactsContract.CommonDataKinds.Phone.NUMBER
+ " NOT LIKE '%@%' THEN 1 ELSE 2 END, "
+ ContactsContract.Contacts.NUMBER
+ ", "
+ ContactsContract.CommonDataKinds.Email.DATA
+ " COLLATE NOCASE";
String filter = ContactsContract.CommonDataKinds.Email.DATA + " NOT LIKE ''";
Cursor cur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, PROJECTION, filter, null, order);