Как (легко) обновить объект 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];
}