【问题标题】:Understanding architecture of Android contacts了解 Android 联系人的架构
【发布时间】:2013-03-26 15:09:00
【问题描述】:

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

所以我为此阅读了几篇文章。我了解每当联系人发生更改时,我们都可以通过内容观察者获得通知,但我们无法获取已添加/更新/删除的联系人。因此,我已经阅读了官方 API,并准备了如何捕获该特定联系人的设计。

我一开始的想法

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

我还了解到,如果联系人被用户删除,Android 不会删除该联系人,但它会将已删除标志设置为 0。所以在这些情况下,行数将是相同的。

Android 还会多次更改联系人的行 ID,如官方文档中所述。那么我们如何才能像查找 uri 一样唯一地识别它们,如果不是,那么我们也必须为此设置观察者。

所以我想知道以上是否正确?在添加联系人的情况下,是否将其添加到光标的最后一行,这意味着如果我检查系统数据库的最后一行是否有联系人,它是否会给我添加的联系人。

【问题讨论】:

  • @paulsm4 亲爱的先生,我的问题是一种继续研究以了解 androids 联系人管理模型的方法。它与任何其他问题没有任何关系。

标签: java android android-contacts


【解决方案1】:

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

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

这也是为什么很难唯一地识别联系人的原因,因为you can split or join them 随时随地。 LOOKUP_KEY 在这种情况下不是很方便。

除 Google 之外的许多应用程序仅提供单向同步,仅从服务到联系人,因此它们是只读的。在这种情况下,删除的标志将不会被使用,并且在它们的同步过程中被简单地删除。因此,您不能简单地依赖标志。

虽然没有一个好的简单解决方案,但我想如果您观察特定的RawContacts,而不是Contacts,实现您想要的要容易得多。希望这有助于您的理解。

【讨论】:

  • 很好的解释。感谢您为您 +1。
【解决方案2】:

我认为最好的做法是监控一个联系人何时聚合到另一个联系人,并通过contactName而不是_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。 如果您需要按部分名称查找联系人,例如要生成按您输入的过滤器建议,请使用 CONTENT_FILTER_URI URI。 如果您需要通过某些数据元素(如电子邮件地址、昵称等)查找联系人,请对 ContactsContract.Data 表使用查询。结果将包含联系人 ID、姓名等。


但问题是,您的联系人列表中可能有两个不是同一个人的“菲利普·莫里斯”。

有关详细信息,请参阅 Android 类文档的 this section

【讨论】:

  • 很好的解释。为你 +1。
  • 您的答案显示了与该问题相对应的更多研究工作。我把这个赏金奖励给你。谢谢。但是如果您找到更多信息,请在此处添加。
  • 如果您找到更多信息,请在此处添加。我想知道你是如何开始搜索的。
  • 当然。我一直在学习,如果我发现一些我认为与您相关的信息,我会在这里发布。
猜你喜欢
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
  • 2016-06-06
  • 1970-01-01
相关资源
最近更新 更多