我想在地址簿中删除一个ABPerson(比方说人),然后添加另一个(说新的),因为属性的某些部分可能会被重用,我想将'person'克隆为'new',这是我的问题,似乎没有做这个克隆的功能,我发现ABRecordCreateCopy但它似乎是MAC指定的,有没有我可以使用的api来避免逐个复制每个属性? 提前谢谢!
杰夫
答案 0 :(得分:1)
您可以通过生成vCard表示并从中创建ABRecordCreateCopy
来编写自己的ABRecord
版本。以下是代码段。记得在不再使用后释放返回的实例。
ABRecordRef ABRecordCreateCopy (ABRecordRef record)
{
ABRecordRef people[1] = {record};
CFArrayRef peopleArray = CFArrayCreate(NULL, people, 1, &kCFTypeArrayCallBacks);
CFDataRef vCardData = ABPersonCreateVCardRepresentationWithPeople(peopleArray);
ABRecordRef source = ABPersonCopySource(record);
ABRecordRef duplicatedPerson = ABPersonCreatePeopleInSourceWithVCardRepresentation(source, vCardData);
ABRecordRef returnedPerson = CFArrayGetValueAtIndex(duplicatedPerson, 0);
CFRelease(source);
CFRelease(vCardData);
CFRelease(duplicatedPerson);
return CFRetain(returnedPerson);
}
答案 1 :(得分:0)
我刚做了一些交叉阅读,似乎没有这样的复制功能。
但是关于这个话题有一些观点:
您不必逐个复制值,至少使用ABRecordCopyCompositeName
,您可以一次复制前缀,后缀,组织,名字和姓氏。
但是,如果只能使用现有记录的某些部分,为什么不将现有记录中不需要的值设置为null或覆盖使用新值更改所需的值。由于您只能使用现有人员的一部分,即使您可以使用ABRecordCreateCopy
,也必须这样做。而且,既然你删除了老人,我不明白你为什么要删除而不只是首先改变它。
关键是,据我所知,这样做的唯一变化是ABPhoneBook
中的不同ID。我无法想象这种情况,这将是一个问题,所有其他值都可以改变。