使用 ContactsContract,查询匹配的姓名或电子邮件

Using ContactsContract, query matching name or email

是否可以对 ContactsContract 进行一次查询以获取一组与显示名称或 phone 号码或电子邮件地址匹配的联系人?

这本质上是联系人和数据的连接 "tables"(在引号中,因为它们只是通过界面看起来像表格,但可能不是)。

换句话说,我想要一个类似于 where 的子句(稍微简化语法)

where Contacts.DISPLAY_NAME like "%?%" 
   or (Data.MIMETYPE = Phone.CONTENT_ITEMTYPE
       and CommonDataKinds.Phone.NUMBER like "%?%")
   or (Data.MIMETYPE = Email.CONTENT_ITEMTYPE
       and CommonDAtaKinds.Email.ADDRESS like "%?%")

表格的连接方式如下

Data.RAW_CONTACT_ID = RawContacts.ID and RawContacts.CONTACT_ID = Contacts.ID

我可以在没有连接的情况下将其作为单独的查询来执行,但是这样就很难对结果进行排序。我希望它们按显示名称排序。

答案就在我面前。 Data table 已经是一个连接(或者看起来像一个连接,也许它在内部是一个非规范化的 table)。因此,我需要做的就是直接查询所有三个匹配项:

where Data.DISPLAY_NAME like "%?%" 
   or (Data.MIMETYPE = Phone.CONTENT_ITEMTYPE
       and CommonDataKinds.Phone.NUMBER like "%?%")
   or (Data.MIMETYPE = Email.CONTENT_ITEMTYPE
       and CommonDAtaKinds.Email.ADDRESS like "%?%")

注意上面的数据.DISPLAY_NAME。

如果你只想匹配name/email/phone那么你可以这样做:

WHERE Data.MIMETYPE IN (StructuredName.CONTENT_ITEM_TYPE, Phone.CONTENT_ITEM_TYPE, Email.CONTENT_ITEM_TYPE) 
AND Data.DATA1 LIKE "%?%"

如果您可以扩展可能的匹配字段,则可以将查询简化为:

WHERE Data.DATA1 LIKE "%?%"

这将匹配 CommonDataKinds.StructuredName.DISPLAY_NAMECommonDataKinds.Email.ADDRESSCommonDataKinds.Phone.NUMBER 等。