2015-05-14 116 views
0

我试图让所有拥有电子邮件,电话或两者联系人列表联系人。 为此我使用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}; 

我感兴趣的只是这种接触的名称。但是因为数据表将每个给定联系人的信息保存在单独的行中,所以得到的光标在其中具有重复的条目。

有什么办法那些如何DISTINCT项?我正在使用CursorLoaderManagerCursorAdapter(也许唯一的方法是在加载器结束时将它们过滤出来?)。

+0

你见过[这](http://stackoverflow.com/questions/2315203/android-distinct-and-groupby-in-contentresolver),这是一个有点老,但可能会有所帮助。 –

+0

我已经试过了所有可惜没有那些“黑客”,帮助因被固定在最新的Android版本或不接触的内容提供商合作:/ – bakua

回答

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); 
+0

ContactsContract.Contacts.NUMBER不存在。你的意思是ContactsContract.CommonDataKinds.Phone.NUMBER? – bakua

+0

查看更新回答 –

+0

但是,这仍然不会排除选择结果中的重复条目。 – bakua

相关问题