0

How to find a single number from ABAdressBook which contains 10 000 contacts?

Currently I am using ABAddressBookRef. Is there an alternative method to reduce iterating?

My code snippet:

if([numberType intValue] == NUMBER_TYPE_EXTERNAL && [appDelegate isNativeContactAccess] == YES)
    {
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(numberType == %@)",[NSNumber numberWithInt:NUMBER_TYPE_EXTERNAL]];
        [fetchRequest setPredicate:predicate];
        NSArray *results = [context executeFetchRequest:fetchRequest error:&error];

        /* The method ABAddressBookCreate() is deprecated in ios 6 so below method is used here  */
        ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, NULL);

        for (NSInteger resultCnt=0; resultCnt<[results count]; resultCnt++)
        {
            Contact *contact = [results objectAtIndex:resultCnt];

            ABRecordID r = [contact.indexValue intValue];
            ABRecordRef fetchData = ABAddressBookGetPersonWithRecordID(addressBook, r);
            if(fetchData != nil)
            {
                NSUInteger lengthOfSearchStr = [searchNumber length];
                ABMultiValueRef multi = ABRecordCopyValue(fetchData, kABPersonPhoneProperty);
                NSUInteger j=0;
                for(j=0; j<ABMultiValueGetCount(multi); j++)
                {
                    NSString *getNum = (NSString *)ABMultiValueCopyValueAtIndex(multi, j);

                    NSString *removedspecialchar6 = [getNum stringByReplacingOccurrencesOfString:@"[^0-9*+#]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0,[getNum length])];

                    if(lengthOfSearchStr <= [removedspecialchar6 length])
                    {
                        number = [removedspecialchar6 substringFromIndex:[removedspecialchar6 length] - lengthOfSearchStr];
                        if([number isEqualToString:searchNumber])
                        {
                            [getNum release];
                            CFRelease(addressBook);
                            CFRelease(multi);
                            return contact;
                        }
                    }
                    [getNum release];
                }
                CFRelease(multi);
            }
        }
        CFRelease(addressBook);
    }
James Z
  • 12,209
  • 10
  • 24
  • 44
Kapil_A
  • 125
  • 2
  • 15
  • `ABAddressBookRef` is marked as deprecated since **iOS 9.0**. You should be using [`CNContact`](https://developer.apple.com/documentation/contacts/cncontact?language=objc) instead. – nayem Apr 06 '18 at 11:27
  • @nayem My application supports from iOS 8.0 so i need to keep ABAddressBookRef. And yes i will be using CNContact for iOS 9.0+. – Kapil_A Apr 06 '18 at 11:53

1 Answers1

0
NSUInteger index;
NSUInteger findIndex;

ABAddressBookRef addressBook = ABAddressBookCreate();
NSArray *constactsNo = (NSArray *) ABAddressBookCopyArrayOfAllPeople(addressBook);

if ( constactsNo ==nil )
    {
    CFRelease(addressBook);
    return;
    }

for ( index=0; index<[constactsNo count]; index++ )
    {
    ABRecordRef find = (ABRecordRef)[constactsNo objectAtIndex:index];

    ABMutableMultiValueRef phoneNumbers = ABRecordCopyValue(find, kABPersonPhoneProperty);
    CFIndex phoneNumberCount = ABMultiValueGetCount( phoneNumbers );

    for ( findIndex =0; findIndex <phoneNumberCount; findIndex ++ )
        {
        CFStringRef phoneNumberLabel = ABMultiValueCopyLabelAtIndex( phoneNumbers, findIndex );
        CFStringRef phoneNumberValue = ABMultiValueCopyValueAtIndex( phoneNumbers, findIndex );
        CFStringRef phoneNumberLocalizedLabel = ABAddressBookCopyLocalizedLabel( phoneNumberLabel );

        CFRelease(phoneNumberLocalizedLabel);
        CFRelease(phoneNumberLabel);
        CFRelease(phoneNumberValue);
        }
    }

[constactsNo release];
CFRelease(addressBook);