ContactsContract 按电话号码选择记录

Posted

技术标签:

【中文标题】ContactsContract 按电话号码选择记录【英文标题】:ContactsContract select records by phone number 【发布时间】:2018-10-09 04:15:26 【问题描述】:

我可以使用下面的查询选择所有联系人

    cr = mActivity.getContentResolver();
    String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " > 0";
    String orderBy = ContactsContract.Contacts.DISPLAY_NAME + " ASC ";
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, selection, null, orderBy);

但是,我有一个电话号码列表,我想创建这样的查询

String selection = ContactsContract.Contacts.PhoneNumber_or_something_else  in (MyPhoneNumberArray)

这样可以吗?

在最坏的情况下,我可以在创建游标后使用 do while 删除相关项目,但据我所知,我无法从游标中删除任何记录。

【问题讨论】:

【参考方案1】:

联系人数据库分为三个主要表:

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

Contacts DB 中的所有电话号码都在 Data 表中,所以这就是您需要查询的内容,您可以从该查询中获取 CONTACT_IDs 的列表,并使用它来获取有关联系人的一般信息,如果您需要。

String[] phonesList = new String[]  "+121212345" ; // will work better if all phones in this list are in e164 format

String[] projection =  Phone.CONTACT_ID, Phone.DISPLAY_NAME, Phone.NUMBER, Phone.NORMALIZED_NUMBER ;
String selection = Phone.NUMBER + " IN ('" + TextUtils.join("','", phonesList) + "') OR " + 
                   Phone.NORMALIZED_NUMBER + " IN ('" + TextUtils.join("','", phonesList) + "')";
Cursor cur = cr.query(Phone.CONTENT_URI, projection, selection, null, null);

while (cur != null && cur.moveToNext()) 
    long id = cur.getLong(0);
    String name = cur.getString(1);
    String phone = cur.getString(2);
    Log.d(TAG, "got " + id + ", " + name + ", " + phone;

【讨论】:

以上是关于ContactsContract 按电话号码选择记录的主要内容,如果未能解决你的问题,请参考以下文章

我正在尝试使用 ContactsContract,Phone 中的联系人 ID 从 CommonDataKinds.Phone 中提取电话号码

ContactsContract.CommonDataKinds.Event.START_DATE 包括联系电话号码

在 Android 中使用 ContactsContract 检索电话号码 - 功能不起作用

如何按姓名和电话号码搜索联系人?

联系人列表仅使用意图 ContactsContract 显示一个电话号码

如何从 Android 设备中仅获取电话号码联系人