1

我对以下代码中使用的谓词有疑问

   NSMutableArray *records = (__bridge NSMutableArray *)ABAddressBookCopyArrayOfAllPeople( addressBook );

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"record.phoneNumber contains %@",@"123"]; 


    @try {
            [records filterUsingPredicate:predicate];
    }
    @catch (NSException *exception) {
        NSLog(@"%@",exception);
    }
    @finally {
        //
    }

我得到的例外是:

[<__NSCFType 0x6e2c5e0> valueForUndefinedKey:]:这个类不符合键记录的键值编码。

我一直在尝试寻找有关地址簿谓词的指南,但没有运气。有什么建议么?

4

1 回答 1

1

您无法使用 过滤通讯簿NSPredicates。此外,phoneNumber 不是ABRecordRef. 用户可以有多个电话号码,因此您需要检查每个电话号码。

你会做这样的事情:

CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook);

NSMutableArray *matchingPeople = [NSMutableArray array];
for (CFIndex i = 0; i < CFArrayGetCount(people); i++) {
    ABRecordRef person = CFArrayGetValueAtIndex(people, i);
    ABMultiValueRef phones = ABRecordCopyValue(person, kABPersonPhoneProperty);
    int phoneNumbers = ABMultiValueGetCount(phones);
    if (phoneNumbers > 0) {
        for (CFIndex i = 0; i < phoneNumbers; i++) {
            NSString *phone = (NSString *)CFBridgingRelease(ABMultiValueCopyValueAtIndex(phones, i));
            if ([phone rangeOfString:@"123"].location != NSNotFound) {
                [matchingPeople addObject:person];
                break;
            }
        }
    }
    CFRelease(phones);
}
CFRelease(people);

就个人而言,我不会将 ABRecordRefs 添加到数组中——我会创建一个值对象,其中仅包含您想要从记录中获取的字段并添加它,因此当您完成循环时,您可以确保您不要t 有任何悬空的 CFType。

于 2012-11-29T22:12:00.200 回答