保持对IOS地址簿条目的长期引用

鉴于ABRecordID可以在云同步之间进行切换,并且在我无法控制的其他情况下,如何维护对IOS地址簿logging的长期引用?

苹果提供了以下指导:

“对特定logging保持长期引用的推荐方法是除了标识符之外,还要存储名字和姓氏,或者名字和姓氏的散列。当您通过ID查找logging时,比较将logging的名称存储到您的存储名称中,如果不匹配,则使用存储的名称查找logging,并存储新的loggingID。

但我不明白这个指导。 如果地址簿中可能有重复的名称,并且用户可以在logging中修改名称,那么这个build议如何工作?

例如,如果用户修改通讯簿logging的名称,我的例程将无法通过ABRecordIDfind它,所以如果我认为通过名称散列存储我不能find重复的名称,而不是新的ABRecordIDlogging我以前引用?

最后,如何长期参考IOS地址簿logging,最好的办法是什么? 如果上述build议确实有效,我错过了什么?

最健壮(但并非完全失败)的方法是创build一个ABRecord字段的优先级排列,并将ABRecordID和ABRecordID一起存储到您自己的(散列)私人logging格式中。 当检索一个私人logging(或在另一个方便的时间),你可以validation私人logging匹配的ABRecord和通过一系列的后备检查,以确保它是准确的。

示例优先级sorting:

  1. ABRecordID
  2. 名字
  3. 电话号码
  4. 邮政编码

当检索logging时,您可以首先匹配ABRecordID 。 如果没有返回结果,你可以searchFirstName + LastName 。 然后,您可以将这些结果与PhoneNumber …匹配。这样,您可以区分2 Bob Smiths,因为他们可能有不同的电话号码(或者可能没有电话号码)。 当然,取决于您的优先级列表多长时间,这个机制将会更健壮。

最后的手段是提示用户区分2个Bob Smiths和全新的ABRecordID ,它们的logging是相同的 – 毕竟,这样一个不方便的提示比允许用户联系错误的Bob Smith要友好得多正如我所说,将是最后的手段)。

但是,这种AB解决scheme可能涉及一些同步问题。

对于使用iOS媒体播放器的人来说,这是一个熟悉的问题。 具体来说,用户音乐库中的MPMediaItemPropertyPersistentID具有属性MPMediaItemPropertyPersistentID ,文档描述如下:

该值不能保证在同步/非同步/同步周期内持续。

换句话说, PersistentID不保证是持久的。 解决scheme包括对MediaItem属性执行类似的回退检查。

RecordID只有在删除或重置时才会被更改,当完成所有新logging时,新的createdProperty和modifiedProperty也会被更新。

  1. 在我第一次阅读地址簿的同时,我将把logging的所有条目和RecordID保存在我的数据库中。

  2. 我将最后一次从联系人同步的联系人保存到我的数据库(将其命名为:lastSyncedTime)并将其存储在某处。

我已经完成了第一次同步联系人,现在可以在将来进行同步。

在遍历所有logging的同时,

  1. 检查createdTime(kABPersonCreationDateProperty)与lastSyncedTime。 如果createdTime> lastSyncedTime,则将recordID存储在“newRecords”NSArray中。

  2. 如果!(步骤1),然后检查modifiedDate(kABPersonModificationDateProperty)与lastSyncedTime。 如果modifiedDate> lastSyncedTime,则将recordID存储在“modifiedRecords”NSArray中。

  3. 如果!(1)&&!(2)将所有recordID存储在“unModifiedRecords”中。

现在我将读取本地数据库中的所有联系人,

  1. 我将删除在“modifiedRecords”或“unModifiedRecords”中找不到的所有本地数据库logging。

  2. 我将更新本地数据库中的所有“modifiedRecords”。

  3. 我将为“newRecords”中的所有logging创build新logging。

  4. 相应地更新lastSyncedTime。

文档正在向您传达您不能将ABRecordID作为永久标识符。

考虑这种情况:用户有一个“鲍勃·史密斯”的logging。 然后,用户删除他的“Bob Smith”logging,然后通过iTunes同步从他的电脑中导入他的联系人(创build一个新的ID)。

所以,如果你想保持一个现有的联系人的永久参考,你可以保留一个参考名称和编号作为暗示,这是你以前使用过的相同的logging,但没有真正的永久性参考

如果您持续提及通讯录联系人,则必须始终准备好处理与之前使用的联系人可能不同的事实。

请参阅: https : //developer.apple.com/library/ios/documentation/ContactData/Conceptual/AddressBookProgrammingGuideforiPhone/Chapters/DirectInteraction.html#//apple_ref/doc/uid/TP40007744-CH6-SW2

清楚地告诉你如何处理它。