iOS - ABAddressBook - 使用谓词进行过滤

时间:2012-11-29 10:32:41

标签: iphone ios abaddressbook

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

   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:]:此类不是密钥记录的密钥值编码。

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

1 个答案:

答案 0 :(得分: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添加到数组中 - 我创建一个值对象,其中只包含您希望从记录中获取的字段并添加它,因此当您完成循环时,您可以确保你没有悬挂的CFT类型。