首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >搜索ABAddressbook iOS SDK

搜索ABAddressbook iOS SDK
EN

Stack Overflow用户
提问于 2011-03-01 10:41:17
回答 4查看 13.2K关注 0票数 6

我想在iPhone地址簿中搜索一个特定的电话号码,然后检索联系人名。目前,我正在循环遍历所有联系人,提取多值属性并与值进行比较。这需要花费太多的时间。我读过苹果地址簿指南,他们说:

“完成其他类型的搜索,使用ABAddressBookCopyArrayOfAllPeople函数,然后使用NSArray方法filteredArrayUsingPredicate:”筛选结果。

有人能给我举个例子来说明如何做到这一点吗?

谢谢。

EN

回答 4

Stack Overflow用户

发布于 2011-06-08 11:04:58

如果你想在有电话号码的联系人中搜索一下,我会告诉你一个建议。

1.取得所有联系人

代码语言:javascript
复制
NSArray *thePeoples = (NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook);

2.从联系人数组(ThePeoples)创建另一个数组(记录),

记录: record1,record2,....recordN

记录:{myContactName: phoneNumber:"1234567890"}

3.使用谓词搜索mutableArray(记录)。

代码语言:javascript
复制
NSPredicate * myPredicate = [NSPredicate predicateWithFormat:@"record.phoneNumber contains %@",string];

NSArray * filteredArray = [records filteredArrayUsingPredicate:myPredicate];

这只是解决方案的一个简单示例,请记住phoneNumber是一个multiValue字段。因此,我们将在模型类变量中包含一个作为电话号码的数组。

票数 9
EN

Stack Overflow用户

发布于 2014-01-16 17:47:27

下面的方法将返回一个数组,该数组包含具有给定电话号码的所有联系人。这个方法花了0.02秒在运行iPhone 5的iOS7上搜索250个联系人。

代码语言:javascript
复制
#import <AddressBook/AddressBook.h>


-(NSArray *)contactsContainingPhoneNumber:(NSString *)phoneNumber {
    /*

     Returns an array of contacts that contain the phone number

     */

    // Remove non numeric characters from the phone number
    phoneNumber = [[phoneNumber componentsSeparatedByCharactersInSet:[[NSCharacterSet alphanumericCharacterSet] invertedSet]] componentsJoinedByString:@""];

    // Create a new address book object with data from the Address Book database
    CFErrorRef error = nil;
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
    if (!addressBook) {
        return [NSArray array];
    } else if (error) {
        CFRelease(addressBook);
        return [NSArray array];
    }

    // Requests access to address book data from the user
    ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {});

    // Build a predicate that searches for contacts that contain the phone number
    NSPredicate *predicate = [NSPredicate predicateWithBlock: ^(id record, NSDictionary *bindings) {
        ABMultiValueRef phoneNumbers = ABRecordCopyValue( (__bridge ABRecordRef)record, kABPersonPhoneProperty);
        BOOL result = NO;
        for (CFIndex i = 0; i < ABMultiValueGetCount(phoneNumbers); i++) {
            NSString *contactPhoneNumber = (__bridge_transfer NSString *) ABMultiValueCopyValueAtIndex(phoneNumbers, i);
            contactPhoneNumber = [[contactPhoneNumber componentsSeparatedByCharactersInSet:[[NSCharacterSet alphanumericCharacterSet] invertedSet]] componentsJoinedByString:@""];
            if ([contactPhoneNumber rangeOfString:phoneNumber].location != NSNotFound) {
                result = YES;
                break;
            }
        }
        CFRelease(phoneNumbers);
        return result;
    }];

    // Search the users contacts for contacts that contain the phone number
    NSArray *allPeople = (NSArray *)CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook));
    NSArray *filteredContacts = [allPeople filteredArrayUsingPredicate:predicate];
    CFRelease(addressBook);

    return filteredContacts;
}
票数 3
EN

Stack Overflow用户

发布于 2011-08-08 09:30:20

用这个。这是我的密码。制作搜索阵列。

代码语言:javascript
复制
        NSLog(@"=====Make People Array with Numbers. Start.");
        peopleWithNumber = [[NSMutableDictionary alloc] init];
        for (int i=0; i < [people count]; i++) {
            NSInteger phoneCount = [self phoneCountAtIndex:i];
            if (phoneCount != 0) {
                NSMutableArray *phoneNumbers = [[NSMutableArray alloc] init];
                for (int j=0 ; j < phoneCount ; j++) {
                    [phoneNumbers addObject:[self phoneNumberAtIndex:i phoneIndex:j]];
                }
                [peopleWithNumber addEntriesFromDictionary:
                 [NSDictionary dictionaryWithObjectsAndKeys:
                  [NSArray arrayWithArray:phoneNumbers],    [self fullNameAtIndex:i], nil]];
            }
        }
        NSLog(@"=====Make People Array with Numbers. End.\n");

搜索方法它(PeopleWithNumber)将比使用数组(人员)更快

“ABAddressBookCopyArrayOfAllPeople(addressBook);”NSArray *people = (NSArray *)

代码语言:javascript
复制
- (NSArray *)searchNamesByNumber:(NSString *)number {

    NSString *predicateString = [NSString stringWithFormat:@"%@[SELF] contains '%@'",@"%@",number];
    NSPredicate *searchPredicate = [NSPredicate predicateWithFormat:predicateString,peopleWithNumber,number];
    NSArray *names = [[peopleWithNumber allKeys] filteredArrayUsingPredicate:searchPredicate];

    return names;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5153377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档