18

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

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

所以我一开始的想法

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

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

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

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

4

2 回答 2

14

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

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

这也是为什么很难唯一识别联系人的原因,因为您可以随时拆分或加入他们LOOKUP_KEY在这种情况下不是很方便。

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

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

于 2013-04-19T16:31:43.310 回答
9

我认为最好的做法是监控一个联系人何时聚合到另一个联系人并通过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 类文档的这一部分

于 2013-04-25T19:55:21.660 回答