鉴于ABRecordID可以在云同步之间进行更改,并且在我无法控制的其他情况下,如何保持对IOS地址簿记录的长期引用?
Apple提供以下指导:
“保持对特定记录的长期引用的推荐方法是除了标识符之外还存储名字和姓氏,或者名字和姓氏的哈希值。当你查找记录时ID,将记录的名称与存储的名称进行比较。如果它们不匹配,请使用存储的名称查找记录,并存储记录的新ID。“
但我不明白这个指导。如果地址簿中可能包含重复的名称,并且由于用户可以修改记录中的名称,这个建议有何用处?
例如,如果用户修改了地址簿记录的名称,我的例程将无法通过ABRecordID找到它,所以如果我认为通过我存储的名称哈希搜索不能找到重复的名称而不是新的ABRecordID对于我之前引用的特定记录?
最后,获得IOS AddressBook记录的长期参考的最佳方法是什么?如果上述建议确实有效,我错过了什么?
答案 0 :(得分:23)
最强大(但并非完全失效)的方法是提出ABRecord字段的优先级排序,并将该列表中的ABRecordID与ABRecordID一起存储到您自己的(散列)私有记录格式中。在检索私人记录时(或在另一个方便的时间),您可以验证私人记录是否与ABRecord匹配,并通过一系列后备检查来确保它是准确的。
优先级排名示例:
检索记录时,您可以先匹配ABRecordID
。如果没有返回结果,您可以搜索FirstName + LastName
。然后,您可以将这些结果与PhoneNumber
...等进行匹配。通过这种方式,您可以区分2个Bob Smiths,因为它们可能具有不同的电话号码(或者可能没有电话号码)。当然,根据优先级列表的长度,这种机制会越健壮。
最后一种方法是提示用户区分2个Bob Smiths和全新的ABRecordID
,其记录在其他方面是相同的 - 毕竟,这样一个不方便的提示会比允许用户友好得多联系错误的鲍勃史密斯(正如我所说,将是最后的手段)。
然而,AB的此解决方案可能涉及一些同步问题。
对于使用iOS Media Player的任何人来说,这是一个熟悉的问题。用户音乐库中的MPMediaItems
具有属性MPMediaItemPropertyPersistentID
,文档描述为:
不保证在同步/非同步/同步周期内保持该值。
换句话说,PersistentID
并不保证是持久的。解决方案包括对MediaItem
属性执行类似的后备检查。
答案 1 :(得分:3)
RecordID仅在删除或重置时更改,完成此操作后,所有新记录都将具有新的createdProperty和modifiedProperty。
在我第一次阅读地址簿时,我会将记录的所有条目与RecordID保存在我的数据库中。
我会保存联系人最后一次从联系人同步到我的数据库(将其命名为:lastSyncedTime)并将其存储在某处。
我已经完成了第一次同步联系人,现在可以在以后随时执行以下操作。
在迭代所有记录时,
检查createdTime(kABPersonCreationDateProperty)vs lastSyncedTime。如果createdTime> lastSyncedTime,将recordID存储在“newRecords”NSArray中。
如果!(步骤1)然后检查modifiedDate(kABPersonModificationDateProperty)和lastSyncedTime。如果modifiedDate> lastSyncedTime,然后将recordID存储在“modifiedRecords”NSArray中。
if!(1)&& !(2)将所有recordID存储在“unModifiedRecords”中。
现在我将阅读本地数据库中的所有联系人
我将删除在“modifiedRecords”或“unModifiedRecords”中找不到的所有本地数据库记录。
我将更新本地数据库中的所有“modifiedRecords”。
我将为“newRecords”中的所有记录创建新记录。
相应地更新lastSyncedTime。
答案 2 :(得分:0)
文档正在与您沟通,您不能指望ABRecordID作为永久标识符。
考虑这种情况:用户有“Bob Smith”的记录。然后,用户删除他的“Bob Smith”记录,然后通过iTunes同步从他的计算机(创建新ID)导入他的联系人。
因此,如果您想保留对现有联系人的永久引用,您可以保留对名称和ID的引用,作为提示它与您之前使用的记录相同 - 但是没有真正的永久引用即可。
如果您对地址簿联系人保留永久性引用,则必须始终准备好处理它可能与您之前使用的联系人不同的事实。
答案 3 :(得分:0)