2011-03-01 15 views
6

मैं एक विशिष्ट फोन नंबर के लिए आईफोन एड्रेस बुक खोजना चाहता हूं, और उसके बाद संपर्क नाम पुनर्प्राप्त करना चाहता हूं। मैं वर्तमान में सभी संपर्कों के माध्यम से लूपिंग कर रहा हूं और बहुविकल्पीय गुणों को निकालने और मूल्य के मुकाबले तुलना कर रहा हूं। यह बहुत अधिक समय ले रहा है। मैं एप्पल पता पुस्तिका गाइड पढ़ा है, और वे कहते हैं:खोज ABAddressbook आईओएस एसडीके

"खोजों के अन्य प्रकार पूरा, समारोह ABAddressBookCopyArrayOfAllPeople उपयोग करना और फिर NSArray विधि filteredArrayUsingPredicate का उपयोग कर परिणामों को फ़िल्टर :."

क्या कोई मुझे बिल्कुल ऐसा करने का उदाहरण दे सकता है?

धन्यवाद।

+0

यह मददगार होगा। यह अन्य प्रश्न के बारे में मेरा उत्तर है, http: // stackoverflow।कॉम/प्रश्न/4272164/कैसे-टू-सर्च-द-आईफोन-एड्रेस-बुक-फॉर-ए-विशिष्ट-फोन-नंबर/6953238 # 6953238 – ChangUZ

+0

एनएसपीडिकेट का उपयोग करके इसे करने का सबसे प्रभावी तरीका यहां है: http: // hesh .am/2012/10/lookup-a-contact-name-use-phone-number-in-abaddressbook/ –

उत्तर

9

यदि आप फोन नंबर के साथ संपर्क में खोज करना चाहते हैं, तो मैं आपको एक सुझाव बताऊंगा।

1.Get सभी संपर्कों

NSArray *thePeoples = (NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook); 

2.Create संपर्क सरणी (thePeoples) से एक और सरणी (रिकॉर्ड),

रिकॉर्ड: [ record1, record2, .... recordN]

रिकॉर्ड: {नाम: "myContactName", PhoneNumber: "1234567890"}

3. पूर्वानुमान के साथ mutableArray (रिकॉर्ड्स) खोजें।

NSPredicate * myPredicate = [NSPredicate predicateWithFormat:@"record.phoneNumber contains %@",string]; 

NSArray * filteredArray = [records filteredArrayUsingPredicate:myPredicate]; 

यह आपके समाधान के लिए एक साधारण उदाहरण है, और याद रखें फोन नंबर एक बहुवचन क्षेत्र है। तो हम मॉडल वर्ग चर में फोन नंबर के रूप में एक सरणी शामिल करेंगे।

+1

संपर्क सरणी से कोई और सरणी बनाकर आपका क्या मतलब है? – AlBeebe

+1

यह कैसे काम करता है? [<__ एनएससीएफटी टाइप 0x6e1f220> valueForUndefinedKey:]: यह वर्ग कुंजी रिकॉर्ड के लिए महत्वपूर्ण मूल्य कोडिंग-अनुरूप नहीं है। –

2

इसका उपयोग करें। यह मेरा कोड है। खोज के लिए ऐरे बनाएं।

 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) सरणी (लोगों)

"NSArray * people = (NSArray *) ABAddressBookCopyArrayOfAllPeople (पता पुस्तिका);"

- (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

आप ABRecordRef अपारदर्शी प्रकार की एक सरणी के साथ एक predicateWithFormat उपयोग नहीं कर सकते। लेकिन तुम predicateWithBlock उपयोग कर सकते हैं:

[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { 
    ABRecordRef person=(__bridge ABRecordRef)evaluatedObject; 
    CFTypeRef theProperty = ABRecordCopyValue(person, kABPersonPhoneProperty); 
    NSArray *phones = (__bridge_transfer NSArray *) ABMultiValueCopyArrayOfAllValues(theProperty); 
    CFRelease(theProperty); 
    BOOL result=NO; 
    for (NSString *value in phones) { 
     if ([value rangeOfString:@"3"].location!=NSNotFound) { 
      result=YES; 
      break; 
     } 
    } 
    return result; 
}]; 
3

निम्न विधि एक सरणी है कि संपर्कों दिया फोन नंबर है, जिसमें वह सभी वापस आ जाएगी। आईओएस 7 चलाने वाले मेरे आईफोन 5 पर 250 संपर्कों को खोजने के लिए इस विधि ने 0.02 सेकंड लिया।

#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; 
} 
संबंधित मुद्दे