1

AddressBook フレームワークは、メソッドを使用して、vCard で ABPerson を初期化する優れた方法を提供しますinitWithVCardRepresentation:

私がしたいのは、特定の vCard で連絡先を更新することです。initWithVCardRepresentation:これにより、新しい uniqueId を持つ新しい ABPerson オブジェクトが得られ、これらの変更の間に uniqueId を保持したいため、使用できません。

このようなことを行う簡単な方法は何ですか?

ありがとう!

4

1 に答える 1

3

initWithVCardRepresentationvCard を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];
}
于 2012-07-16T18:28:14.017 に答える