【问题标题】:Filter Android ContactsContract.Data by Company AND Display Name按公司和显示名称过滤 Android ContactsContract.Data
【发布时间】:2023-01-26 18:33:22
【问题描述】:

到目前为止我有类似的东西,但似乎 ContactsContract.Data URI 返回具有相同 CONTACT_ID 和 LOOKUP_KEY 的多条记录。有没有办法让这个游标返回不同的记录?

        private static final Uri URI = ContactsContract.Data.CONTENT_URI;

        @SuppressLint("InlinedApi")
        private static final String[] PROJECTION = {
                ContactsContract.Data._ID,
                ContactsContract.Data.CONTACT_ID,
                ContactsContract.Data.LOOKUP_KEY,
                ContactsContract.Data.DISPLAY_NAME_PRIMARY
        };

        private static final String SELECTION =
                ContactsContract.Data.DISPLAY_NAME_PRIMARY + " LIKE ?" +
                " AND " + ContactsContract.Data.MIMETYPE + " = " + ContactsContract.CommonDataKinds.Organization.MIMETYPE +
                " AND " + ContactsContract.CommonDataKinds.Organization.COMPANY + " LIKE ?";

        private static final String SORT_ORDER =
                ContactsContract.Data.DISPLAY_NAME_PRIMARY + " ASC";

        @Override
        public Loader<Cursor> onCreateLoader(int loaderId, Bundle args) {
            String contactsFilter = getFilter(contactsSearch);
            String companyFilter = getFilter(companySearch);

            // Starts the query
            return new CursorLoader(
                    getActivity(),
                    URI,
                    PROJECTION,
                    SELECTION,
                    new String[] { contactsFilter, companyFilter},
                    SORT_ORDER
            );
        }

这是此游标的转储示例:

   42 {
       _id=74752
       contact_id=12603
       lookup=2645ie9ffe868ace3d43
       display_name=Person 1
    }
    43 {
       _id=74753
       contact_id=12603
       lookup=2645ie9ffe868ace3d43
       display_name=Person 1
    }
    44 {
       _id=74756
       contact_id=12603
       lookup=2645ie9ffe868ace3d43
       display_name=Person 1
    }

_ID 不同,但我希望游标返回每人 1 条记录,并且这 3 条记录都是同一个人。

想法?

【问题讨论】:

    标签: android android-contacts


    【解决方案1】:

    联系人数据库由三个主要表组成:

    1. Contacts - 每个条目代表一个联系人,并将一个或多个RawContacts 组合在一起
    2. RawContacts - 每个条目代表有关由某些SyncAdapter(例如 Whatsapp、Google、Facebook、Viber)同步的联系人的数据,这将多个数据条目分组
    3. Data - 有关联系人、电子邮件、电话等的实际数据。每一行都是属于单个 RawContact 的单个数据

      通常发生的情况是,希望创建新联系人的应用程序(例如 Google、Whatsapp、Linkedin)会在 RawContacts 表中创建一个新行,该行通常只包含一个名称,然后使用该行的 _ID 添加行进入 Data 表格以获取电话、电子邮件、地址、照片等。

      您正在查询 Data 表,这意味着如果某个联系人具有来自 2 个来源(例如 2 个 Google 帐户)的原始联系人,并且两个原始联系人都包含具有特定公司名称的数据行,您的游标将返回 2 个结果那个联系。

      我建议不要在这里使用CursorLoader,而是创建一个常规的Cursor 来自您的投影/选择/选择-args,遍历它以获取数据,然后使用 HashMap 通过 contact-id(或其他方法)使条目按其联系 ID 区分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-05
      • 1970-01-01
      • 1970-01-01
      • 2016-09-27
      • 1970-01-01
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多