了解Android联系人的架构

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

所以我读了几个post。 所以我收集的信息是

每当联系人发生变化时,我们都可以通过内容观察员得到通知。但是我们无法得到哪些联系人已被添加/更新/删除。 所以我已经阅读了官方的apis,并准备好了我的devise如何捕捉特定的联系人。

所以我一开始就想到了

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

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

Android也根据官方文档中的说明多次更改联系人的行ID。 那么我们如何能够唯一地识别它们,如查找uri,如果不是,那么我们也必须把它看作是观察者。

所以我只是想知道我的想法是否正确。 而在添加联系人的情况下,它将被添加到光标的最后一行,或不意味着如果我检查系统数据库的最后一行的联系人,它会给我的联系人添加与否。

请帮助我了解Android联系人的架构。

Solutions Collecting From Web of "了解Android联系人的架构"

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

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

这也是为什么很难确定一个联系人,因为你可以随时拆分或join 。 对于这种情况, LOOKUP_KEY不太方便。

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

虽然没有一个简单的解决scheme,但我想如果你观察一个特定的RawContacts而不是Contacts ,那么实现你想要的更容易。 希望这有助于你的理解。

我认为最好的做法是监控联系人何时聚合到另一个联系人,并通过contactName而不是_ID或CONTACT_ID识别他们。 看看这个可能的联系操作:

联系人不能显式创build。 插入原始联系人时,提供者将首先尝试查找代表同一个人的联系人。 如果find一个,原始联系人的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。 如果您需要通过部分名称查找联系人,例如为了生成filter即用型的build议,请使用CONTENT_FILTER_URI URI。 如果您需要通过电子邮件地址,昵称等数据元素查找联系人,请使用对ContactsContract.Data表的查询。 结果将包含联系人ID,姓名等


但问题是,你可能在你的联系人列表中有两个不是同一个人的“Phillip Morris”。

有关更多信息,请参阅Android类文档的这一部分

希望能帮助到你。