了解Android联系人的架构

Nik*_*wal 18 java android android-contacts

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

所以我读了几篇帖子.我知道,只要联系人发生变更,我们就可以通过内容观察员获得通知,但我们无法获得添加/更新/删除的联系人.所以我已阅读官方API并准备我的设计如何捕获该特定联系人.

所以我一开始就想到了什么

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

我还了解到,如果用户删除了联系人,Android不会删除联系人,但是在删除的标志上设置为0.因此在这些情况下,行数将相同.

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

所以我想知道以上是否正确?并且在添加联系人的情况下,它将被添加到游标的最后一行或不意味着如果我检查系统数据库的最后一行是否接触,它将给我添加或不添加联系人.

tnj*_*tnj 14

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

在Android上,接触可以与多个相关联的原始接触,其可以从许多数据提供者,诸如谷歌,Facebook,Skype和等来提供.例如,如果您本地联系人中的某个朋友也在使用Skype,则会分别存在两个原始联系人ContactContracts.RawContacts,但它们会自动聚合并在您查询时显示为一个联系人ContactsContract.Contacts.

这也是为什么很难唯一地识别联系人,因为您可以随时拆分或加入联系人.LOOKUP_KEY这种情况不是很方便.

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

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


Chr*_*ian 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,姓名等.


但问题是,您的联系人列表中可能有两个"Phillip Morris"不是同一个人.

有关详细信息,请参阅Android类文档的此部分.