1

我想在通讯录中删除一个 ABPerson(比如 person),然后添加另一个(比如 new),因为某些属性可能会被重用,我想将“person”克隆为“new”,这是我的问题,它似乎没有执行此克隆的功能,我发现 ABRecordCreateCopy 但它似乎是指定的 MAC,有没有我可以使用的 api 来避免一个一个地复制每个属性?提前致谢!

杰夫

4

2 回答 2

1

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);
}
于 2013-08-18T07:12:54.213 回答
0

我只是做了一些交叉阅读,似乎没有这样的复制功能。但是关于该主题有几点:您不必逐个复制值,至少ABRecordCopyCompositeName可以一次复制前缀、后缀、组织、名字和姓氏。

但是,如果您只能使用现有记录的某些部分,为什么不将现有记录中不需要的值设置为 null 或用新值覆盖需要更改的值。由于您只能使用现有人员的部分内容,即使您可以使用ABRecordCreateCopy. 而且由于您无论如何都删除了老人,所以我不明白您为什么要删除而不是首先更改它。关键是,据我所知,这样做的唯一变化是ABPhoneBook. 我无法想象这样的情况,这将是一个问题,并且所有其他值都可以更改。

于 2011-08-22T20:30:15.367 回答