【问题标题】:Get contact that have email or phone number with unique results获取具有独特结果的电子邮件或电话号码的联系人
【发布时间】:2023-04-02 17:18:01
【问题描述】:

我正在尝试列出具有电子邮件、电话或两者的联系人列表。 为此,我使用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};

我只对此类联系人的姓名感兴趣。但是由于数据表将给定联系人的每个信息保存在单独的行中,因此结果游标中有重复的条目。

有什么方法可以区分这些条目吗?我正在使用CursorLoaderManagerCursorAdapter(也许唯一的方法是在加载程序完成时将它们过滤掉?)。

【问题讨论】:

  • 你见过this,它有点旧,但可能会有帮助。
  • 我已经尝试了所有方法,但不幸的是没有任何帮助,因为这些“黑客”已在最新的 android 版本中得到修复,或者它们不适用于联系内容提供商:/

标签: android email distinct android-contacts phone-number


【解决方案1】:

使用以下代码。

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

【讨论】:

  • ContactsContract.Contacts.NUMBER 不存在。你是说 ContactsContract.CommonDataKinds.Phone.NUMBER 吗?
  • 但是,这仍然不会从选择结果中排除重复的条目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
  • 2023-04-04
  • 2011-10-10
  • 2014-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多