iphone dev - можно ли клонировать ABRecord? - PullRequest
1 голос
/ 06 марта 2011

Я хочу удалить одного ABPerson (скажем, персона) в адресной книге, а затем добавить еще один (скажем, новый), так как некоторые части атрибутов могут быть повторно использованы, я хочу клонировать 'person' в 'new'вопрос, кажется, нет никакой функции, чтобы сделать этот клон, я нашел ABRecordCreateCopy, но, кажется, это указано MAC, есть ли API, который я мог бы использовать, чтобы избежать копирования каждого свойства по одному?Заранее спасибо!

Джефф

Ответы [ 2 ]

1 голос
/ 18 августа 2013

Вы можете написать свою собственную версию 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);
}
0 голосов
/ 23 августа 2011

Я только что сделал перекрестное чтение, и, похоже, такой функции копирования нет. Но есть некоторые моменты по этой теме: Вам не нужно копировать значения одно за другим, по крайней мере, с помощью ABRecordCopyCompositeName вы можете одновременно копировать префикс, суффикс, организацию, имя и фамилию.

Однако, если вы можете использовать только некоторые части существующей записи, почему бы не установить ненужные значения в существующей записи, чтобы обнулить или перезаписать те, которые необходимы для изменения новыми значениями. Поскольку вы можете использовать только части существующего человека, вам придется делать это, даже если вы можете использовать ABRecordCreateCopy. И так как вы удаляете старого человека в любом случае, я не понимаю, почему вы хотите удалить, а не просто изменить его в первую очередь. Дело в том, что, насколько я понимаю, единственным изменением в этом случае будет другой идентификатор в ABPhoneBook. Я не могу представить ситуацию, когда это будет проблемой, и все другие значения могут быть изменены.

...