我可以使用下面的查询选择所有联系人
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删除相关项目,但是据我所知,我无法从光标中删除任何记录。
触点db在三个主要表中组织:
-
Contacts
-每个条目代表一个联系人,将一个或多个RawContacts
分组在一起 -
RawContacts
-每个条目代表有关某些SyncAdapter
(例如WhatsApp,Google,Facebook,Viber(同步的联系的数据,此分组多个数据条目 -
Data
-有关联系,电子邮件,电话等的实际数据。每行都是属于单个RawContact
的单个数据
Contacts DB中的所有电话号码都在Data
表中,因此您需要查询,您可以从该查询中获取CONTACT_ID
s的列表,并在需要时使用它以获取有关联系人的一般信息。
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;
}