理解Android联系人架构

18

我正在开发一个Android应用程序,需要知道何时添加/更新/删除联系人。

因此,我阅读了几篇文章。我了解到我们可以通过内容观察器在联系人更改时得到通知,但无法知道哪些联系人已被添加/更新/删除。因此,我阅读了官方API并准备了我的设计以捕获特定的联系人。

所以我一开始想的是

  1. 我们将存储所有联系人的ID、删除标志和版本号
  2. 每当联系人变化时,我将获取我的表格行数和Android系统的行数。
  3. 如果我的行数小于系统的行数,则表示联系人已被删除。
  4. 如果我的行数大于系统的行数,则表示联系人已被添加。
  5. 如果不是这些情况,则表示其中一个联系人的版本已更改。

我还学到Android不会在用户删除联系人时直接删除该联系人,而是将删除标志设置为0。因此,在这些情况下,行数将不变。

正如官方文档所述,Android还会多次更改联系人的行ID。那么我们该如何唯一地识别它们呢,比如通过查找URI,并且如果不能,则也必须为此放置观察者。

所以我想知道上述内容是否正确?当联系人被添加时,它会被添加到光标的最后一行还是不会,也就是说,如果我检查系统数据库中联系人的最后一行,它会给我添加的联系人还是不会。


听起来像是一个重复的问题,可以参考如何监听联系人数据库的变化 - paulsm4
@paulsm4 尊敬的先生,我的问题是为了继续研究Android联系人管理模型的方法。它与任何其他问题都没有关系。 - Nikhil Agrawal
2个回答

14

让我尽可能地解释一下。基本上,您的策略看起来非常不错,但实际上比您想象的要复杂一些。

在Android上,一个联系人可以与多个原始联系人相关联,这些联系人可能来自许多数据提供者,如Google、Facebook、Skype等。例如,如果您本地联系人中的一个朋友也在使用Skype,则在ContactContracts.RawContacts中会分别存在两个原始联系人,但当您查询ContactsContract.Contacts时,它们将自动聚合并显示为一个联系人。

这也是为什么很难唯一标识一个联系人,因为您随时可以拆分或合并它们。对于这种情况,LOOKUP_KEY并不是非常方便。

许多应用程序除了谷歌之外,只提供单向同步,即仅从服务到联系人,因此它们是只读的。在这种情况下,删除标志将不会被使用,并且在同步过程中会被简单地删除。因此,您不能仅依赖标志。
虽然没有一个好的简单解决方案,但我认为如果您观察特定的RawContacts而不是Contacts,那么实现您想要的内容会更容易。希望这有助于您的理解。

不错的解释。谢谢你,给你加个赞 +1。 - Nikhil Agrawal

9
我认为最佳实践是在联系人聚合到另一个联系人时,通过联系人姓名而不是_ID或CONTACT_ID进行识别和监控。 看一下这个可能的联系人操作:
插入 联系人不能被显式创建。当插入原始联系人时,提供程序首先会尝试查找代表同一人的联系人。如果找到了一个联系人,则原始联系人的CONTACT_ID列将获取聚合联系人的_ID。如果没有找到匹配项,则提供程序会自动插入新联系人,并将其_ID放入新插入的原始联系人的CONTACT_ID列中。
更新 只有联系人的某些列是可修改的:TIMES_CONTACTED、LAST_TIME_CONTACTED、STARRED、CUSTOM_RINGTONE、SEND_TO_VOICEMAIL。更改联系人上的这些任何一列也会更改所有组成的原始联系人上的这些列。
删除 小心删除联系人!删除聚合联系人会删除所有组成的原始联系人。相应的同步适配器将注意到各自原始联系人的删除并将其从其后端存储中删除。
查询
如果您需要阅读单个联系人,请考虑使用CONTENT_LOOKUP_URI而不是CONTENT_URI。 如果您需要通过电话号码查找联系人,请使用PhoneLookup.CONTENT_FILTER_URI,该URI已针对此目的进行了优化。 如果您需要通过部分名称查找联系人,例如生成随输入即过滤的建议,请使用CONTENT_FILTER_URI URI。 如果您需要通过电子邮件地址、昵称等某些数据元素查找联系人,请对ContactsContract.Data表进行查询。结果将包含联系人ID、姓名等信息。
问题在于你的联系人列表中可能会有两个不同的“Phillip Morris”。 要获取更多信息,请参见Android类文档的本节

很好的解释。给你点赞。 - Nikhil Agrawal
1
你的回答显示出了更多与问题相关的研究努力。我将向你授予这个赏金。谢谢。但如果你发现更多信息,请在此添加。 - Nikhil Agrawal
如果你找到更多信息,请在这里添加。我想知道你是如何开始搜索的。 - Nikhil Agrawal
当然。我不断地学习,如果我发现一些我认为对你有用的信息,我会在这里发布。 - A. Cristian Nogueira

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接