【问题标题】:iPhone - How to fetch the contact detail using address book?iPhone - 如何使用通讯录获取联系方式?
【发布时间】:2012-05-10 18:53:06
【问题描述】:

我想获取联系人信息中保存了生日的联系人,并且 检索这些联系人的详细信息,例如电话号码、电子邮件、生日等。

这是我尝试过的:

ABAddressBookRef myAddressBook = ABAddressBookCreate();
NSArray *allPeople = (NSArray *)ABAddressBookCopyArrayOfAllPeople(myAddressBook);
contactList = [[NSMutableArray alloc]init];

    for (id record in allPeople) 
    {
        NSMutableDictionary *newRecord = [[NSMutableDictionary alloc] init];
        CFTypeRef bDayProperty = ABRecordCopyValue((ABRecordRef)record, kABPersonBirthdayProperty);

        if (ABRecordCopyValue((ABRecordRef)record, kABPersonBirthdayProperty)) 
        {
                NSDate *date=(NSDate*)bDayProperty;
                [newRecord setObject:date forKey:@"birthDate"];
                date=nil;
               [date release];  
        }
      CFRelease(myAddressBook);
    }

有什么想法吗?

【问题讨论】:

  • 你用什么方法编写这段代码?由于 [newRecord setObject:date forKey:@"birthDate"],你的值被覆盖;

标签: iphone abaddressbook


【解决方案1】:

你可以试试这个代码。

ABAddressBookRef m_addressbook = ABAddressBookCreate();

if (!m_addressbook) {
    NSLog(@"opening address book");
}

CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(m_addressbook);
CFIndex nPeople = ABAddressBookGetPersonCount(m_addressbook);
NSLog(@"  cfindex %ld",nPeople);

for ( int i=0;i < nPeople;i++) { 
    NSMutableDictionary *dOfPerson=[NSMutableDictionary dictionary];

        ABRecordRef ref = CFArrayGetValueAtIndex(allPeople,i);

    //For username and surname      
    CFStringRef firstName, lastName;
    firstName = ABRecordCopyValue(ref, kABPersonFirstNameProperty);
    lastName  = ABRecordCopyValue(ref, kABPersonLastNameProperty);
    [dOfPerson setObject:[NSString stringWithFormat:@"%@ %@", firstName, lastName] forKey:@"name"];

    //For Email ids
    ABMutableMultiValueRef eMail  = ABRecordCopyValue(ref, kABPersonEmailProperty);
    if(ABMultiValueGetCount(eMail) > 0) {
        [dOfPerson setObject:(NSString *)ABMultiValueCopyValueAtIndex(eMail, 0) forKey:@"email"];
        [contactList addObject:dOfPerson];
    }

    //For Phone number
    NSString* mobileLabel;
    for(CFIndex j = 0; j < ABMultiValueGetCount(phones); j++)
           {
        mobileLabel = (NSString*)ABMultiValueCopyLabelAtIndex(phones, j);
        if([mobileLabel isEqualToString:(NSString *)kABPersonPhoneMobileLabel])
        {
[dOfPerson setObject:(NSString*)ABMultiValueCopyValueAtIndex(phones, i) forKey:@"Phone"];
        }
        else if ([mobileLabel isEqualToString:(NSString*)kABPersonPhoneIPhoneLabel])
        {
[dOfPerson setObject:(NSString*)ABMultiValueCopyValueAtIndex(phones, i) forKey:@"Phone"];
            break ;
        }

        }
    }

【讨论】:

    【解决方案2】:

    最后一个代码包含大量内存泄漏。在所有情况下,您都使用 AB...Copy.. (ABRecordCopyValue, ABMultiValueCopyValueAtIndex, ABRecordCopyValue,...) 您必须释放内存!

    【讨论】:

    • thanx,但我已经发布了所有 AB...副本,但现在它按照@sonu 的建议工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多