Fuzzy search for IOS address book
1. Get the address book first
-(Void) ReadAllPeoples
{
[ContactsremoveAllObjects];
ABAddressBookRef addressBook = abaddressbookcreatewitexceptions (nil, nil );
Dispatch_semaphore_t sema = dispatch_semaphore_create (0 );
ABAddressBookRequestAccessWithCompletion (addressBook, ^ (bool granted, CFErrorRef error)
{
Dispatch_semaphore_signal (sema );
});
Dispatch_semaphore_wait (sema, DISPATCH_TIME_FOREVER );
CFArrayRef results = ABAddressBookCopyArrayOfAllPeople (addressBook );
For (int I = 0; I <CFArrayGetCount (results); I ++)
{
ABRecordRef person = CFArrayGetValueAtIndex (results, I );
NSString * lastname = (_ bridgeNSString *) ABRecordCopyValue (person, kABPersonLastNameProperty );
NSLog (@ "lastname: % @", lastname );
ABMultiValueRef phone = ABRecordCopyValue (person, kABPersonPhoneProperty );
// Read the contact information
For (int k = 0; k
{
NSString * personPhone = (_ bridgeNSString *) ABMultiValueCopyValueAtIndex (phone, k );
If (lastname = nil ){
Lastname = @"";
}
If (person = nil ){
Continue;
}
// This sentence is a storage structure and contacts is NSMutableArray *
[ContactsaddObject: @ [lastname, personPhone];
}
}
CFRelease (results );
CFRelease (addressBook );
[Self. tableViewreloadData];
}
2. fuzzy query of name (lastname) and mobile phone number (personPhone)
NSPredicate * predicate = [NSPredicate predicateWithFormat: @ "self [0] contains [cd] % @ | self [1] contains [cd] % @", user input string, user input string];
FilterData = [[NSArrayalloc] initWithArray: [contactsfilteredArrayUsingPredicate: predicate];
FilterData is the query result.