【问题标题】:Android get a cursor only with contacts that have an email listed >android 2.0Android 仅使用列出电子邮件的联系人获得光标 >android 2.0
【发布时间】:2021-12-24 01:57:07
【问题描述】:

我有以下代码从content provider获取联系人

String[] columns = new String[] {
                ContactsContract.Contacts.DISPLAY_NAME,
                ContactsContract.Contacts._ID,
                ContactsContract.Contacts.PHOTO_ID };
        Cursor cursor = managedQuery(ContactsContract.Contacts.CONTENT_URI,
                columns, null, null, null);

我使用这个来通过他们的 id 获取特定联系人的电子邮件:

Cursor emails = getContentResolver().query(
                    ContactsContract.CommonDataKinds.Email.CONTENT_URI,
                    null,
                    ContactsContract.CommonDataKinds.Email.CONTACT_ID
                            + " = " + contact.getContactId(), null, null);

我当前的实现传递游标中的每一行并获取其电子邮件并将它们存储在 java 对象的 arrayList 中。

我想知道是否有可能只是查询内容提供者并返回一个光标,其中仅包含具有 ids/name 等列出了电子邮件地址的联系人。

这种方式获取联系人列表的等待时间较长。我将此列表用于列表适配器。如果我只能获取有电子邮件的联系人,我可以在我的列表中使用光标适配器。

这样的事情可能吗?我怎样才能加快这个过程?

【问题讨论】:

    标签: android contacts android-cursor


    【解决方案1】:

    @CapDroid

    DArkO 帖子中的固定工作代码:

        ContentResolver cr = context.getContentResolver();
        String[] PROJECTION = new String[] { ContactsContract.RawContacts._ID, 
                ContactsContract.Contacts.DISPLAY_NAME,
                ContactsContract.Contacts.PHOTO_ID,
                ContactsContract.CommonDataKinds.Email.DATA, 
                ContactsContract.CommonDataKinds.Photo.CONTACT_ID };
        String order = "CASE WHEN " 
                + ContactsContract.Contacts.DISPLAY_NAME 
                + " NOT LIKE '%@%' THEN 1 ELSE 2 END, " 
                + ContactsContract.Contacts.DISPLAY_NAME 
                + ", " 
                + 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);
    

    您的光标将包含必要的 ID 以及姓名和电子邮件地址。这段代码的性能很好,因为它只请求很少的列。

    【讨论】:

    • 那份订单是干什么用的?
    • 为了在我的 LG G3 上工作,我不得不将过滤器修改为“''”而不是“NOT LIKE ''”
    【解决方案2】:

    我解决了这个问题,它是如何完成的:

    更新

       String[] PROJECTION = new String[] { ContactsContract.RawContacts._ID,
            ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.PHOTO_ID,
            Email.DATA, ContactsContract.CommonDataKinds.Photo.CONTACT_ID };
    
        String order = " CASE WHEN " + ContactsContract.Contacts.DISPLAY_NAME
            + " NOT LIKE '%@%' THEN 1" + " ELSE 2 END, "
            + ContactsContract.Contacts.DISPLAY_NAME + " COLLATE NOCASE";
        String filter = Email.DATA + " NOT LIKE '' ) GROUP BY ( " + Email.DATA;
    
        return mContent.query(Email.CONTENT_URI,
                          PROJECTION, filter, null, order);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-15
      相关资源
      最近更新 更多