在Android上按特定条件从SQL数据库获取联系人

在Android上按特定条件从SQL数据库获取联系人,android,contacts,contactscontract,Android,Contacts,Contactscontract,如何在Android上查询符合特定条件的所有联系人 比方说,我想拥有所有联系人,他们有姓名、电话号码,但没有个人资料图片 正如我所理解的SQL一样,我需要某种类型的选择,它被传递到我的查询中,但是在上面的示例中它到底是什么样子的呢 我在问,因为我目前正在运行一个应用程序,它首先查询所有联系人,然后我对其进行迭代和过滤,这似乎比直接查询正确的联系人要差得多,但它们是通过联系人内容提供商访问的 联系人内容提供程序以三表方式组织。数据结构的底部是数据表。在这里,您将找到与特定联系人相关的所有数据(稍后

如何在Android上查询符合特定条件的所有联系人

比方说,我想拥有所有联系人,他们有姓名、电话号码,但没有个人资料图片

正如我所理解的SQL一样,我需要某种类型的选择,它被传递到我的查询中,但是在上面的示例中它到底是什么样子的呢


我在问,因为我目前正在运行一个应用程序,它首先查询所有联系人,然后我对其进行迭代和过滤,这似乎比直接查询正确的联系人要差得多,但它们是通过联系人内容提供商访问的

联系人内容提供程序以三表方式组织。数据结构的底部是数据表。在这里,您将找到与特定联系人相关的所有数据(稍后将讨论)。数据表存储电话号码、电子邮件、地址等信息。它使用MIME类型数据库中定义的MIME名称-值对来存储这些信息。上一级是RawContacts数据库。此处列出了与同一账户相关的所有信息(即联系John Doe可能拥有twitter和Facebook账户)。简而言之,RawContacts表跟踪属于同一个人的数据MIME类型,因此不需要为不同的帐户多次存储相同的信息。在数据结构的顶部有联系人表,该表为一个人分组所有信息。这基本上是一种将所有帐户信息统一到一个联系人中的方法。像平常一样考虑这些联系人

您应该看看Loader类,它允许您在后台线程上执行查询。如果在实现游标的加载器回调后使用该类,则将创建一个游标加载器。它的构造函数参数之一是 一个典型的MySQL where子句,您可以在其中指定要作为查询的一部分包含的约束


您可以找到一个引导加载程序查询数据库的指南

联系人存储在SQLite数据库中,但可以通过联系人内容提供商访问,这是正确的

联系人内容提供程序以三表方式组织。数据结构的底部是数据表。在这里,您将找到与特定联系人相关的所有数据(稍后将讨论)。数据表存储电话号码、电子邮件、地址等信息。它使用MIME类型数据库中定义的MIME名称-值对来存储这些信息。上一级是RawContacts数据库。此处列出了与同一账户相关的所有信息(即联系John Doe可能拥有twitter和Facebook账户)。简而言之,RawContacts表跟踪属于同一个人的数据MIME类型,因此不需要为不同的帐户多次存储相同的信息。在数据结构的顶部有联系人表,该表为一个人分组所有信息。这基本上是一种将所有帐户信息统一到一个联系人中的方法。像平常一样考虑这些联系人

您应该看看Loader类,它允许您在后台线程上执行查询。如果在实现游标的加载器回调后使用该类,则将创建一个游标加载器。它的构造函数参数之一是 一个典型的MySQL where子句,您可以在其中指定要作为查询的一部分包含的约束


您可以找到一个引导加载程序查询数据库的指南

嘿,谢谢你有用的回答:)这三个问题以前是很清楚的。谢谢你的加载器建议,我不知道,我自己写了所有异步逻辑^^我可以传递给加载器的约束应该完全相同,我可以传递给getContentResolver().query(…),对吗?我的问题是,我真的不知道sql及其语句,我需要指定过滤器,以便光标指向过滤项的数据集。加载程序中的游标和自定义游标之间应该没有区别。它实际上与执行getContentResolver.query()相同。您可以在线查找SQLite教程。例如,在CursorLoader的where参数上,您可以说“_id=1。我相信每个SQLite表中都需要_I'd列,这就是我选择它的原因。您可以将该列作为字符串传递到构造函数中,它应该返回第一行数据。然后您可以使用3VL运算符(或、和等)添加更多约束。如果您有一个名称列,则可以传递“\u id=1和name=John Doe”。如果名称列的值为John Doe,则将返回第一行。好的。但类似的内容是否有效?我甚至可以说xyz!=1吗?字符串选择=Contacts contract.Contacts.DISPLAY\u name+“=”“+1+”和“+Contacts contract.Contacts.has\u PHONE\u NUMBER+”='“+1+”,而不是“+Contacts contract.Contacts.PHOTO_ID;这回答了你的问题吗?如果是这样的话,你能把这篇文章标记为已回答。嘿,谢谢你有用的回答:)这三个问题以前是很清楚的。谢谢你的加载器建议,我不知道,我自己写了所有异步逻辑^^我可以传递给加载器的约束应该完全相同,我可以传递给getContentResolver().query(…),对吗?我的问题是,我真的不知道sql及其语句,我需要指定过滤器,以便光标指向过滤项的数据集。加载程序中的游标和自定义游标之间应该没有区别。它实际上与执行getContentResolver.query()相同。您可以在线查找SQLite教程。例如,在CursorLoader的where参数上,您可以说“_id=1。我相信每个SQLite表中都需要_I'd列,这就是我选择它的原因