我想在通讯录中删除一个 ABPerson(比如 person),然后添加另一个(比如 new),因为某些属性可能会被重用,我想将“person”克隆为“new”,这是我的问题,它似乎没有执行此克隆的功能,我发现 ABRecordCreateCopy 但它似乎是指定的 MAC,有没有我可以使用的 api 来避免一个一个地复制每个属性?提前致谢!
杰夫
ABRecordCreateCopy
您可以通过生成 vCard 表示并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);
}
我只是做了一些交叉阅读,似乎没有这样的复制功能。但是关于该主题有几点:您不必逐个复制值,至少ABRecordCopyCompositeName
可以一次复制前缀、后缀、组织、名字和姓氏。
但是,如果您只能使用现有记录的某些部分,为什么不将现有记录中不需要的值设置为 null 或用新值覆盖需要更改的值。由于您只能使用现有人员的部分内容,即使您可以使用ABRecordCreateCopy
. 而且由于您无论如何都删除了老人,所以我不明白您为什么要删除而不是首先更改它。关键是,据我所知,这样做的唯一变化是ABPhoneBook
. 我无法想象这样的情况,这将是一个问题,并且所有其他值都可以更改。