在我的许多应用中,它需要将一些数据与地址簿中的联系人相关联。我过去做的是保存ABPerson的记录ID,并使用该ID在每次应用程序启动时提取信息。但是,越来越多的我发现这种方法是错误的,因为很多时候用户会使用像mobileme这样的服务,其中地址簿被擦除和重新同步。这会导致记录ID更改,并且所有关联都将丢失。用户必须浏览每一个并重新链接它们。
什么是更好的方法来保存一个强大的指向地址簿条目的指针?
答案 0 :(得分:5)
您应该存储三个值:记录ID,名字和姓氏。
1)如果记录ID没有改变,你就是黄金 - 只需用它来找到合适的记录。
2)如果ABAddressBookGetPersonWithRecordID()
没有找到您存储的记录ID的记录(它返回NULL),那么您需要根据姓名和姓氏搜索人员记录。如果已经有一个包含内存中所有人员记录的数组,您可以下载到潜在地使用ABAddressBookCopyPeopleWithName()
或编写自己的定位代码。找到新记录取决于您。找到新记录后,您可以使用新记录ID更新数据存储。
最终,您最终存储记录ID以直接使用,如果它没有改变(如果您很幸运),另外存储一些不太可能改变的地址簿条目中的密钥。与地址簿条目关联的人员或组织的名称最有可能更改。当然,您应该考虑到您可能找不到包含存储记录ID的记录或搜索名称的情况。这可能意味着记录被删除,或者可能意味着记录被重命名。无论您认为哪种方式最适合您的特定应用,您都应该处理这种情况。
答案 1 :(得分:2)
我知道这是去年,但是,我想我可能会建议我使用的方法。我第一次要求用户选择联系人(为了将我的应用程序的某些私人数据与之关联),然后抓取记录,创建我自己的内部记录ID(通常是应用程序名称的首字母和序列号)通过添加我自己的内部记录ID的新ABRelatedName(“pref”名称“Other”)值来修改联系人。在.vcf
中看起来像这样item3.X-ABRELATEDNAMES;type=pref:BZA101
item3.X-ABLabel:_$!<Other>!$_
这样,当我添加关于用户的更多数据时,我可以简单地引用该记录ID,例如上次应用用户联系他们等等。似乎为我工作。
希望能有所帮助。
答案 2 :(得分:0)
如果地址簿确实被完全擦除并重新加载,并且唯一没有更改的部分是显示名称,那么将显示名称存储为链接似乎是唯一的选择。