【问题标题】:Using ContactsContract, query matching name or email使用 ContactsContract,查询匹配的姓名或电子邮件
【发布时间】:2018-05-16 21:07:27
【问题描述】:

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

这本质上是联系人和数据“表”的连接(用引号括起来,因为它们在界面上看起来只是表,但可能不是)。

换句话说,我想要一个类似的 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

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

【问题讨论】:

    标签: android android-contentprovider contactscontract


    【解决方案1】:

    如果您只想匹配姓名/电子邮件/电话,那么您可以这样做:

    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 等。

    【讨论】:

      【解决方案2】:

      答案让我眼前一亮。 数据表已经是一个连接(或者看起来像一个,可能它在内部是一个非规范化的表)。因此,我需要做的就是直接查询所有三个匹配项:

      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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多