ContactsContract按电话号码选择记录

时间:2018-04-28 13:53:56

标签: android android-contacts android-cursor contactscontract

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

    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删除相关项目,但据我所知,我无法从光标中删除任何记录。

1 个答案:

答案 0 :(得分:1)

Contacts DB分为三个主要表:

  1. Contacts - 每个条目代表一个联系人,并将一个或多个RawContacts
  2. 组合在一起
  3. RawContacts - 每个条目代表有关某些SyncAdapter(例如Whatsapp,Google,Facebook,Viber)同步的联系人的数据,此组合包含多个数据条目
  4. Data - 有关联系人,电子邮件,电话等的实际数据,每一行都是属于单个RawContact的单个数据
  5. 联系人数据库中的所有电话号码都在Data表中,因此您需要查询,您可以从该查询中获取CONTACT_ID的列表并使用它来获取常规信息如果你需要,请联系。

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