Как (легко) обновить объект ABPerson с помощью vCard и сохранить его уникальный идентификатор?

AddressBook Framework предлагает отличный способ инициализации ABPerson с помощью vCard, используя initWithVCardRepresentation: метод.

Я хочу обновить контакт с определенной визитной карточкой. Я не могу использовать initWithVCardRepresentation: потому что это даст мне новый объект ABPerson с новым uniqueId, и я хочу сохранить uniqueId между этими изменениями.

Какой простой способ сделать что-то подобное?

Спасибо!

1 ответ

Решение

initWithVCardRepresentation по-прежнему самый приятный способ превратить вашу vCard в ABPerson,

Просто используйте его результаты, чтобы найти подходящего человека в вашей адресной книге, а затем переберите свойства vCard, поместив их в существующую запись. Сохранение в конце укрепит ваши изменения.

В следующем примере предполагается, что уникальные "ключи" будут last-name, first-name, Вы можете изменить элемент поиска, если хотите включить компании, в которых нет названия или чего-либо еще, или вы можете изменить схему итерации, получив [AddressBook people], а затем перебирая людей и используя только те записи, где ключ-значение пары соответствуют вашему удовольствию.

- (void)initOrUpdateVCardData:(NSData*)newVCardData {
    ABPerson* newVCard = [[ABPerson alloc] initWithVCardRepresentation:newVCardData];
    ABSearchEleemnt* lastNameSearchElement
      = [ABPerson searchElementForProperty:kABLastNameProperty
                                     label:nil
                                       key:nil
                                     value:[newVCard valueForProperty:kABLastNameProperty]
                                comparison:kABEqualCaseInsensitive];
    ABSearchEleemnt* firstNameSearchElement
      = [ABPerson searchElementForProperty:kABFirstNameProperty
                                     label:nil
                                       key:nil
                                     value:[newVCard valueForProperty:kABFirstNameProperty]
                                comparison:kABEqualCaseInsensitive];
    NSArray* searchElements
      = [NSArray arrayWithObjects:lastNameSearchElement, firstNameSearchElement, nil];
    ABSearchElement* searchCriteria
      = [ABSearchElement searchElementForConjunction:kABSearchAnd children:searchElements];
    AddressBook* myAddressBook = [AddressBook sharedAddressBook];
    NSArray* matchingPersons = [myAddressBook recordsMatchingSearchElement:searchCriteria];
    if (matchingPersons.count == 0)
    {
        [myAddressBook addRecord:newVCard];
    }
    else if (matchingPersons.count > 1)
    {
        // decide how to handle error yourself here: return, or resolve conflict, or whatever
    }
    else
    {
        ABRecord* existingPerson = matchingPersons.lastObject;
        for (NSString* property in [ABPerson properties])   // i.e. *all* potential properties
        {
            // if the property doesn't exist in the address book, value will be nil
            id value = [newVCard valueForProperty:property];
            if (value)
            {
                NSError* error;
                if (![existingPerson setValue:value forProperty:property error:&error] || error)
                    // handle error
            }
        }
        // newVCard with it's new unique-id will now be thrown away
    }
    [myAddressBook save];
}
Другие вопросы по тегам