0

名簿の連絡先から特定の電話番号を削除したい。

trueを返しているため、機能しているように見えますが、機能していません。

どうか、誰かがここで私を助けてくれますか?これは素晴らしいでしょう!

ABAddressBookRef ab = ABAddressBookCreate();
 ABRecordRef record = ABAddressBookGetPersonWithRecordID(ab,[myID intValue]);
     NSError *error = NULL;

ABMultiValueRef phoneNumbers = ABRecordCopyValue(record,kABPersonPhoneProperty);

for(CFIndex i=0; i < ABMultiValueGetCount(phoneNumbers); i++){
      NSString *phoneNumber = (NSString *)ABMultiValueCopyValueAtIndex(phoneNumbers,i);
      //ckDebug(@"phoneNumber = %@", phoneNumber);

      if ([[oDict objectForKey:@"value"] isEqualToString:phoneNumber]) {

              BOOL didRemove = ABMultiValueRemoveValueAndLabelAtIndex(ABMultiValueCreateMutableCopy(phoneNumbers),i);
              ckDebug(@"didRemove = %@\n", (didRemove ? @"TRUE" : @"FALSE"));

              //and save it!
              BOOL didSave = ABAddressBookSave(ab, (CFErrorRef *) error);

              ckDebug(@"didSave = %@\n", (didSave ? @"TRUE" : @"FALSE"));
              if (error) {
                  ckDebug(@"ABAddressBookSaveError = %@", error);
              }
      }
      [phoneNumber release];
}
CFRelease(ab);
4

2 に答える 2

2

したがって、ソリューションは次のとおりです。

MultiValueRef の MutableCopy を作成し、そこから値を削除し、コピーをレコードに戻して保存します...

このような:

ABAddressBookRef ab = ABAddressBookCreate();
    ABRecordRef record = ABAddressBookGetPersonWithRecordID(ab,[myID intValue]);
    NSError *error = NULL;

    ABMultiValueRef phoneNumbers = ABRecordCopyValue(record,kABPersonPhoneProperty);
    ABMutableMultiValueRef phoneNumberMV = ABMultiValueCreateMutableCopy(phoneNumbers);

    for(CFIndex i=0; i < ABMultiValueGetCount(phoneNumberMV); i++){
        NSString *phoneNumber = (NSString *)ABMultiValueCopyValueAtIndex(phoneNumberMV,i);
        //ckDebug(@"phoneNumber = %@", phoneNumber);

        if ([[oDict objectForKey:@"value"] isEqualToString:phoneNumber]) {
            //now delete it!!! ;-)
            /*
            ckDebug(@"phoneNumbers = %@",phoneNumbers);
            ckDebug(@"index = %d", i);
            */
            BOOL didRemove = ABMultiValueRemoveValueAndLabelAtIndex(phoneNumberMV,i);
            ckDebug(@"didRemove = %@\n", (didRemove ? @"TRUE" : @"FALSE"));

            BOOL didSet = ABRecordSetValue(record, kABPersonPhoneProperty, phoneNumberMV, nil);
            ckDebug(@"didSet = %@\n", (didSet ? @"TRUE" : @"FALSE"));

            //and save it!
            BOOL didSave = ABAddressBookSave(ab, (CFErrorRef *) error);

            ckDebug(@"didSave = %@\n", (didSave ? @"TRUE" : @"FALSE"));
            if (error) {
                ckDebug(@"ABAddressBookSaveError = %@", error);
            }
        }
        [phoneNumber release];
    }
    CFRelease(ab);
于 2012-05-24T08:46:25.953 に答える
1

電話番号フィールドのコピーから電話番号を削除しますが、変更されたリストでレコードを更新することはありません。ABRecordSetValue電話をかける前に電話する必要がありますABAddressBookSave

于 2012-05-23T23:15:22.687 に答える