内容均来自关东升老师的ios开发指南
上一篇写了联系人框架的一些必须知道的知识
现在写一下读取联系人数据相关操作
要读取通讯录数据库 需要
- 创建通讯录对象
- 查询获取数据(所有或者部分)
- 获取通讯录某一条记录(某个人的所有数据)
- 获取这个人的各种属性数据
就是这样
CFErrorRef error = NULL; //创建一个通讯录操作对象 ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
第一参数是保留参数,传递NULL即可;
//查找联系人 - (void)filterContentForSearchText:(NSString *)searchText { //判断授权状态 if (ABAddressBookGetAuthorizationStatus()!=kABAuthorizationStatusAuthorized) { return ; } CFErrorRef error = NULL; ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error); if (searchText.length == 0) { //查找所有 listContacts = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook)); } else{ //根据字符串查找前缀关键字 CFStringRef cfSearchText = (CFStringRef)CFBridgingRetain(searchText); listContacts = CFBridgingRelease(ABAddressBookCopyPeopleWithName(addressBook, cfSearchText)); CFRelease(cfSearchText); } //这里应该刷新表格 [self.tableView reloadData]; CFRelease(addressBook); }
授权的状态: kABAuthorizationStatusNotDetermined 用户还没有决定 kABAuthorizationStatusRestricted, 受限制 kABAuthorizationStatusDenied, 拒绝 kABAuthorizationStatusAuthorized 许可
联系人的属性
kABPersonFirstNameProperty; // 名字 kABPersonLastNameProperty; // 姓氏 kABPersonMiddleNameProperty; // 中间名 kABPersonPrefixProperty; // 前缀 kABPersonSuffixProperty; // 后缀 kABPersonNicknameProperty; // 昵称 kABPersonFirstNamePhoneticProperty; // 名字的汉语拼音或者音标 kABPersonLastNamePhoneticProperty; // 姓氏汉语拼音或者音标 kABPersonMiddleNamePhoneticProperty; // 中间名的汉语拼音或者音标 kABPersonOrganizationProperty; // 组织名 kABPersonJobTitleProperty; // 工作头衔 kABPersonDepartmentProperty; // 部门 kABPersonNoteProperty; // 备注 kABPersonBirthdayProperty; // 生日 kABPersonCreationDateProperty; // 创建时间 kABPersonModificationDateProperty; // 修改日期//多值属性 (一个属性中又多个值) 有标签、值、id kABPersonPhoneProperty ; //电话号码属性 kABMultiStringPropertyType;//类型 kABPersonEmailProperty ; //e-mail属性 kABMultiStringPropertyType;//类型 kABPersonURLProperty ; //URL属性 kABMultiStringPropertyType;//类型 kABPersonRelatedNamesProperty; // 亲属关系人属性 kABMultiStringPropertyType;//类型 kABPersonAddressProperty ; //地址属性 kABMultiDictionaryPropertyType;//类型 kABPersonInstantMessageProperty;//及时聊天属性 kABMultiDictionaryPropertyType;//类型 kABPersonSocialProfileProperty; //社交账号属性 kABMultiDictionaryPropertyTypel;//类型利用上面的属性来查找想要的值
下面是单值属性:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell) { cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } //从搜索出的联系人数组中获取一条数据 转换为ABRecordRef格式 ABRecordRef thisPerson = CFBridgingRetain([listContacts objectAtIndex:[indexPath row]]); //查找这条记录中的名字 NSString *firstName = CFBridgingRelease(ABRecordCopyValue(thisPerson, kABPersonFirstNameProperty)); firstName = firstName != nil? firstName:@""; //查找这条记录中的姓氏 NSString *lastName = CFBridgingRelease(ABRecordCopyValue(thisPerson, kABPersonLastNameProperty)); cell.textLabel.text = [NSString stringWithFormat:@"%@%@",firstName,lastName]; CFRelease(thisPerson); return cell; }
下面是多值属性的查找方法:
//获取多值属性 - (void)multiValueProperty { ABRecordID personRecordID = [personIDASNumber intValue];//personIDASNumber是NSNumber类型的值用来保存RecordID的值 CFErrorRef error = NULL; ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error); //通过ABRecordID属性找到ABRecord ABRecordRef personRecord = ABAddressBookGetPersonWithRecordID(addressBook, personRecordID); //通过ABRecord 查找多值属性 ABMultiValueRef emailProperty = ABRecordCopyValue(personRecord, kABPersonEmailProperty); //将多值属性的多个值转化为数组 NSArray * emailArray = CFBridgingRelease(ABMultiValueCopyArrayOfAllValues(emailProperty)); for (int index = 0; index < emailArray.count; index++) { NSString *email = [emailArray objectAtIndex:index]; NSString *emailLabel = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(emailProperty, index)); //判断当前这个值得标签 if ([emailLabel isEqualToString:(NSString *)kABWorkLabel]) { NSLog(@"%@", email); } } }
获取联系人图片:
//获取联系人的图片 - (void)setImage { CFErrorRef error = NULL; ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error); ABRecordRef cecordRef = ABAddressBookGetPersonWithRecordID(addressBook,[personIDASNumber intValue]); //判断联系人是否有照片 if (ABPersonHasImageData(cecordRef)) { //获取照片数据 NSData *photoData = CFBridgingRelease(ABPersonCopyImageData(cecordRef)); self.imageView.image = [UIImage imageWithData:photoData]; } }
时间: 2024-12-29 17:29:19