iPhone:更新联系人的所有地址(家庭,工作,其他)

时间:2010-02-11 08:07:43

标签: iphone set contact street-address

我正在以编程方式创建新的联系人。除地址外,它运作良好。以下是添加联系人的代码

ABAddressBookRef libroDirec = ABAddressBookCreate();
ABRecordRef persona = ABPersonCreate();
ABRecordSetValue(persona, kABPersonFirstNameProperty, tempSingle.firstName , nil);
        ABRecordSetValue(persona, kABPersonLastNameProperty, tempSingle.lastName, nil);
        ABRecordSetValue(persona, kABPersonMiddleNameProperty, tempSingle.middleName, nil);

if([tempSingle.homeStreet1 length]>0 || [tempSingle.homeStreet2 length]>0 || [tempSingle.homeCity length]>0 || [tempSingle.homeState length]>0 || [tempSingle.homePostal length]>0 || [tempSingle.homeCountry length]>0 )
        {
            ABMutableMultiValueRef multiHome = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType);

            NSMutableDictionary *addressDictionary = [[NSMutableDictionary alloc] init];
            NSString *homeStreetAddress=[NSString stringWithFormat:@"%@ %@",tempSingle.homeStreet1,tempSingle.homeStreet2];
            [addressDictionary setObject:homeStreetAddress forKey:(NSString *) kABPersonAddressStreetKey];
            [addressDictionary setObject:tempSingle.homeCity forKey:(NSString *)kABPersonAddressCityKey];
            [addressDictionary setObject:tempSingle.homeState forKey:(NSString *)kABPersonAddressStateKey];
            [addressDictionary setObject:tempSingle.homePostal forKey:(NSString *)kABPersonAddressZIPKey];
            [addressDictionary setObject:tempSingle.homeCountry forKey:(NSString *)kABPersonAddressCountryKey];
            //[addressDictionary setObject:@"US" forKey:(NSString *)kABPersonAddressCountryCodeKey];
            bool didAddHome = ABMultiValueAddValueAndLabel(multiHome, addressDictionary, kABHomeLabel, NULL);
            if(didAddHome)
            {
                ABRecordSetValue(persona, kABPersonAddressProperty, multiHome, NULL);
            }
            [addressDictionary release];
        }

        if([tempSingle.workStreet1 length]>0 || [tempSingle.workStreet2 length]>0 || [tempSingle.workCity length]>0 || [tempSingle.workState length]>0 || [tempSingle.workPostal length]>0 || [tempSingle.workCountry length]>0 )
        {
            ABMutableMultiValueRef multiWork = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType);

            NSMutableDictionary *addressDictionary1 = [[NSMutableDictionary alloc] init];
            NSString *workStreetAddress=[NSString stringWithFormat:@"%@ %@",tempSingle.workStreet1,tempSingle.workStreet2];
            [addressDictionary1 setObject:workStreetAddress forKey:(NSString *) kABPersonAddressStreetKey];
            [addressDictionary1 setObject:tempSingle.workCity forKey:(NSString *)kABPersonAddressCityKey];
            [addressDictionary1 setObject:tempSingle.workState forKey:(NSString *)kABPersonAddressStateKey];
            [addressDictionary1 setObject:tempSingle.workPostal forKey:(NSString *)kABPersonAddressZIPKey];
            [addressDictionary1 setObject:tempSingle.workCountry forKey:(NSString *)kABPersonAddressCountryKey];
            bool didAddWork = ABMultiValueAddValueAndLabel(multiWork, addressDictionary1, kABWorkLabel, NULL);
            if(didAddWork)
            {
                ABRecordSetValue(persona, kABPersonAddressProperty, multiWork, NULL);
            }
            [addressDictionary1 release];
        }

        if([tempSingle.otherStreet1 length]>0 || [tempSingle.otherStreet2 length]>0 || [tempSingle.otherCity length]>0 || [tempSingle.otherState length]>0 || [tempSingle.otherPostal length]>0 || [tempSingle.otherCountry length]>0 )
        {
            ABMutableMultiValueRef multiOther = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType);

            NSMutableDictionary *addressDictionary2 = [[NSMutableDictionary alloc] init];
            NSString *otherStreetAddress=[NSString stringWithFormat:@"%@ %@",tempSingle.otherStreet1,tempSingle.otherStreet2];
            [addressDictionary2 setObject:otherStreetAddress forKey:(NSString *) kABPersonAddressStreetKey];
            [addressDictionary2 setObject:tempSingle.otherCity forKey:(NSString *)kABPersonAddressCityKey];
            [addressDictionary2 setObject:tempSingle.otherState forKey:(NSString *)kABPersonAddressStateKey];
            [addressDictionary2 setObject:tempSingle.otherPostal forKey:(NSString *)kABPersonAddressZIPKey];
            [addressDictionary2 setObject:tempSingle.otherCountry forKey:(NSString *)kABPersonAddressCountryKey];
            bool didAddOther = ABMultiValueAddValueAndLabel(multiOther, addressDictionary2, kABOtherLabel, NULL);
            if(didAddOther)
            {
                ABRecordSetValue(persona, kABPersonAddressProperty, multiOther, NULL);
            }
            [addressDictionary2 release];
        }
ABAddressBookAddRecord(libroDirec, persona, nil);

        CFRelease(persona);
ABAddressBookSave(libroDirec, nil);
    CFRelease(libroDirec);

如果我只保存家庭住址或仅保存工作地址或仅保存其他地址,那么代码效果很好。但如果我保存所有地址(家庭,工作和其他),那么只有最后地址保存到联系人。请建议我如何解决此错误 请说明有什么不对?

1 个答案:

答案 0 :(得分:0)

由kABPersonAddressProperty标识的属性只能使用一个值,类型为ABMutableMultiValueRef,并且此多值可以包含许多带有一些标签的字典。

你可能需要的可能就是这个......

ABMutableMultiValueRef multiAddress = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType);

if([tempSingle.homeStreet1 length]>0 || [tempSingle.homeStreet2 length]>0 || [tempSingle.homeCity length]>0 || [tempSingle.homeState length]>0 || [tempSingle.homePostal length]>0 || [tempSingle.homeCountry length]>0 )
        {
            NSMutableDictionary *addressDictionary = [[NSMutableDictionary alloc] init];
            NSString *homeStreetAddress=[NSString stringWithFormat:@"%@ %@",tempSingle.homeStreet1,tempSingle.homeStreet2];
            [addressDictionary setObject:homeStreetAddress forKey:(NSString *) kABPersonAddressStreetKey];
            [addressDictionary setObject:tempSingle.homeCity forKey:(NSString *)kABPersonAddressCityKey];
            [addressDictionary setObject:tempSingle.homeState forKey:(NSString *)kABPersonAddressStateKey];
            [addressDictionary setObject:tempSingle.homePostal forKey:(NSString *)kABPersonAddressZIPKey];
            [addressDictionary setObject:tempSingle.homeCountry forKey:(NSString *)kABPersonAddressCountryKey];
            //[addressDictionary setObject:@"US" forKey:(NSString *)kABPersonAddressCountryCodeKey];
            bool didAddHome = ABMultiValueAddValueAndLabel(multiAddress, addressDictionary, kABHomeLabel, NULL);
            if(!didAddHome)
            {
                NSLog(@"unable to add address");
            }
            [addressDictionary release];
        }

        if([tempSingle.workStreet1 length]>0 || [tempSingle.workStreet2 length]>0 || [tempSingle.workCity length]>0 || [tempSingle.workState length]>0 || [tempSingle.workPostal length]>0 || [tempSingle.workCountry length]>0 )
        {
            NSMutableDictionary *addressDictionary1 = [[NSMutableDictionary alloc] init];
            NSString *workStreetAddress=[NSString stringWithFormat:@"%@ %@",tempSingle.workStreet1,tempSingle.workStreet2];
            [addressDictionary1 setObject:workStreetAddress forKey:(NSString *) kABPersonAddressStreetKey];
            [addressDictionary1 setObject:tempSingle.workCity forKey:(NSString *)kABPersonAddressCityKey];
            [addressDictionary1 setObject:tempSingle.workState forKey:(NSString *)kABPersonAddressStateKey];
            [addressDictionary1 setObject:tempSingle.workPostal forKey:(NSString *)kABPersonAddressZIPKey];
            [addressDictionary1 setObject:tempSingle.workCountry forKey:(NSString *)kABPersonAddressCountryKey];
            bool didAddWork = ABMultiValueAddValueAndLabel(multiAddress, addressDictionary1, kABWorkLabel, NULL);
            if(!didAddWork)
            {
                NSLog(@"unable to add address");
            }
            [addressDictionary1 release];
        }

        if([tempSingle.otherStreet1 length]>0 || [tempSingle.otherStreet2 length]>0 || [tempSingle.otherCity length]>0 || [tempSingle.otherState length]>0 || [tempSingle.otherPostal length]>0 || [tempSingle.otherCountry length]>0 )
        {
            NSMutableDictionary *addressDictionary2 = [[NSMutableDictionary alloc] init];
            NSString *otherStreetAddress=[NSString stringWithFormat:@"%@ %@",tempSingle.otherStreet1,tempSingle.otherStreet2];
            [addressDictionary2 setObject:otherStreetAddress forKey:(NSString *) kABPersonAddressStreetKey];
            [addressDictionary2 setObject:tempSingle.otherCity forKey:(NSString *)kABPersonAddressCityKey];
            [addressDictionary2 setObject:tempSingle.otherState forKey:(NSString *)kABPersonAddressStateKey];
            [addressDictionary2 setObject:tempSingle.otherPostal forKey:(NSString *)kABPersonAddressZIPKey];
            [addressDictionary2 setObject:tempSingle.otherCountry forKey:(NSString *)kABPersonAddressCountryKey];
            bool didAddOther = ABMultiValueAddValueAndLabel(multiAddress, addressDictionary2, kABOtherLabel, NULL);
            if(!didAddOther)
            {
                NSLog(@"unable to add address");
            }
            [addressDictionary2 release];
        }
ABRecordSetValue(persona, kABPersonAddressProperty, multiAddress, NULL);
ABAddressBookAddRecord(libroDirec, persona, nil);

CFRelease(persona);
ABAddressBookSave(libroDirec, nil);
CFRelease(libroDirec);