我对以下代码中使用的谓词有疑问
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:]:此类不是密钥记录的密钥值编码。
我一直试图找一本关于地址簿谓词的指南,但没有运气。有什么建议?
答案 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类型。