一、创建联系人

1、创建联系人记录

ABRecord person = ABPersonCreate();

2、保存或修改单值属性

bool ABRecordSetValue(ABRecordRef record,ABPropertyID property,CFTypeRef value,CFErrorRef *error
);

例子:

CFError error = NULL;// 保存姓名
ABRecordSetValue(person,kABPersonFirstNameProperty,(__bridge CFTypeRef)self.txtFirstName.text,&error);ABRecordSetValue(person,kABPersonLastNameProperty,(__bridge CFTypeRef)self.txtLastName.text,&error);

3、保存或修改多值属性

bool ABMultiValueAddValueAndLabel(ABMutableMultiValueRef multiValue,CFTypeRef value,CFStringRef label,ABMultiValueIdentifier *outIdentifier);

例:

// 创建可变多值类型对象
ABMutableMultiValueRef multi = ABMultiValueCreateMutable(kABMultiStringProper);
// 设置电话号码
ABMultiValueAddValueAndLabel(multi,(__bridge CFTypeRef)self.txtMobile.text,kABPersonPhoneMobileLabel,NULL);
ABMultiValueAddValueAndLabel(multi,(__bridge CFTypeRef)self.txtIPhone.text,kABPersonPhoneIPhoneLabel,NULL);
// 添加电话号码到记录
ABRecordSetValue(person,kABPersonPhoneProperty,multi,&error);
CFRelease(multi);

4、添加记录到数据库

bool ABAddressBookAddRecord(ABAddressBookRef addressBook,ABRecordRef record,CFErrorRef *error);bool ABAddressBookSave(ABAddressBookSave addressBook,CFErrorRef *error);

例:

ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL,&error);ABAddressBookAddRecord(addressBook,person,&error);ABAddressBookSave(addressBook,&error);CFRelease(person);CFRelease(addressBook);

二、修改联系人信息

1、获取联系人记录

ABRecordRef ABAddressBookGetPersonWithRecordID(ABAddressBookRef addressBook,ABRecordID recordID);

三、删除联系人信息

bool ABAddressBookRemoveRecord(ABAddressBookRef addressBook,ABRecordRef record,CFErrorRef *error);

四、实战代码

#import <UIKit/UIKit.h>
#import <AddressBook/AddressBook.h>
#import "T20140622161906DetailViewController.h"@interface T20140622161906ViewController : UITableViewController@property (strong,nonatomic) NSArray *listContacts;@end

#import "T20140622161906ViewController.h"@interface T20140622161906ViewController ()@end@implementation T20140622161906ViewController- (void)viewDidLoad
{[super viewDidLoad];CFErrorRef error = NULL;ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {if (granted) {//查询所有self.listContacts = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook));[self.tableView reloadData];CFRelease(addressBook);}});
}
// 删除联系人后 重新加载列表信息
- (void)viewWillAppear:(BOOL)animated
{[super viewWillAppear:YES];CFErrorRef error = NULL;ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);self.listContacts = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook));CFRelease(addressBook);[self.tableView reloadData];}
- (void)didReceiveMemoryWarning
{[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{return 1;
}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{return [self.listContacts count];
}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{static NSString *CellIdentifier = @"reUseCell";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];if (cell == nil) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];}ABRecordRef thisPerson = CFBridgingRetain([self.listContacts objectAtIndex:[indexPath row]]);NSString *firstName = CFBridgingRelease(ABRecordCopyValue(thisPerson, kABPersonFirstNameProperty));firstName = firstName != nil?firstName:@"";NSString *lastName =  CFBridgingRelease(ABRecordCopyValue(thisPerson, kABPersonLastNameProperty));lastName = lastName != nil?lastName:@"";cell.textLabel.text = [NSString stringWithFormat:@"%@ %@",firstName,lastName];CFRelease(thisPerson);return cell;
}- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{if ([[segue identifier] isEqualToString:@"showDetail"]) {NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];ABRecordRef thisPerson = CFBridgingRetain([self.listContacts objectAtIndex:[indexPath row]]);T20140622161906DetailViewController *detailViewController = [segue destinationViewController];ABRecordID personID = ABRecordGetRecordID(thisPerson);NSNumber *personIDAsNumber = [NSNumber numberWithInt:personID];detailViewController.personIDAsNumber = personIDAsNumber;CFRelease(thisPerson);}
}
@end

#import <UIKit/UIKit.h>
#import <AddressBook/AddressBook.h>@interface T20140622161906DetailViewController : UITableViewController@property (weak, nonatomic) IBOutlet UIImageView *imageView;@property (weak, nonatomic) IBOutlet UILabel *lblName;
@property (weak, nonatomic) IBOutlet UITextField *txtMobile;@property (weak, nonatomic) IBOutlet UITextField *txtIPhone;@property (weak, nonatomic) IBOutlet UITextField *txtWorkEmail;
@property (weak, nonatomic) IBOutlet UITextField *txtHomeEmail;@property (strong, nonatomic) NSNumber* personIDAsNumber;- (IBAction)saveClick:(id)sender;
- (IBAction)deleteClick:(id)sender;@end

#import "T20140622161906DetailViewController.h"@interface T20140622161906DetailViewController ()@end@implementation T20140622161906DetailViewController- (id)initWithStyle:(UITableViewStyle)style
{self = [super initWithStyle:style];if (self) {// Custom initialization
    }return self;
}- (void)viewDidLoad
{[super viewDidLoad];ABRecordID personID = [self.personIDAsNumber intValue];CFErrorRef error = NULL;ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook, personID);//取得姓名属性NSString *firstName = CFBridgingRelease(ABRecordCopyValue(person, kABPersonFirstNameProperty));firstName = firstName != nil?firstName:@"";NSString *lastName =  CFBridgingRelease(ABRecordCopyValue(person, kABPersonLastNameProperty));lastName = lastName != nil?lastName:@"";[self.lblName setText: [NSString stringWithFormat:@"%@ %@",firstName,lastName]];//取得Email属性ABMultiValueRef emailsProperty = ABRecordCopyValue(person, kABPersonEmailProperty);NSArray* emailsArray = CFBridgingRelease(ABMultiValueCopyArrayOfAllValues(emailsProperty));for(int index = 0; index< [emailsArray count]; index++){NSString *email = [emailsArray objectAtIndex:index];NSString *emailLabel = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(emailsProperty, index));if ([emailLabel isEqualToString:(NSString*)kABWorkLabel]) {[self.txtWorkEmail setText:email];} else if ([emailLabel isEqualToString:(NSString*)kABHomeLabel]) {[self.txtHomeEmail setText:email];} else {NSLog(@"%@: %@", @"其它Email", email);}}CFRelease(emailsProperty);//取得电话号码属性ABMultiValueRef phoneNumberProperty = ABRecordCopyValue(person, kABPersonPhoneProperty);NSArray* phoneNumberArray = CFBridgingRelease(ABMultiValueCopyArrayOfAllValues(phoneNumberProperty));for(int index = 0; index< [phoneNumberArray count]; index++){NSString *phoneNumber = [phoneNumberArray objectAtIndex:index];NSString *phoneNumberLabel = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(phoneNumberProperty, index));if ([phoneNumberLabel isEqualToString:(NSString*)kABPersonPhoneMobileLabel]) {[self.txtMobile setText:phoneNumber];} else if ([phoneNumberLabel isEqualToString:(NSString*)kABPersonPhoneIPhoneLabel]) {[self.txtIPhone setText:phoneNumber];} else {NSLog(@"%@: %@", @"其它电话", phoneNumber);}}CFRelease(phoneNumberProperty);//取得个人图片if (ABPersonHasImageData(person)) {NSData *photoData = CFBridgingRelease(ABPersonCopyImageData(person));if(photoData){[self.imageView setImage:[UIImage imageWithData:photoData]];}}CFRelease(addressBook);}- (void)didReceiveMemoryWarning
{[super didReceiveMemoryWarning];}- (IBAction)saveClick:(id)sender {ABRecordID personID = [self.personIDAsNumber intValue];CFErrorRef error = NULL;ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook, personID);// 设置电话号码ABMutableMultiValueRef multi = ABMultiValueCreateMutable(kABMultiStringPropertyType);ABMultiValueAddValueAndLabel(multi,  (__bridge CFTypeRef)self.txtMobile.text,kABPersonPhoneMobileLabel, NULL);ABMultiValueAddValueAndLabel(multi,  (__bridge CFTypeRef)self.txtIPhone.text,kABPersonPhoneIPhoneLabel, NULL);// 添加电话号码到数据库ABRecordSetValue(person, kABPersonPhoneProperty, multi, &error);CFRelease(multi);// 设置Email属性multi = ABMultiValueCreateMutable(kABMultiStringPropertyType);ABMultiValueAddValueAndLabel(multi,  (__bridge CFTypeRef)self.txtHomeEmail.text,kABHomeLabel, NULL);ABMultiValueAddValueAndLabel(multi,  (__bridge CFTypeRef)self.txtWorkEmail.text,kABWorkLabel, NULL);// 添加Email到数据库ABRecordSetValue(person, kABPersonEmailProperty, multi, &error);CFRelease(multi);// 保存到数据库ABAddressBookSave(addressBook, &error);CFRelease(addressBook);//导航回根视图控制器ViewController
    [self.navigationController popToRootViewControllerAnimated:YES];
}- (IBAction)deleteClick:(id)sender {ABRecordID personID = [self.personIDAsNumber intValue];CFErrorRef error = NULL;ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook, personID);//删除记录ABAddressBookRemoveRecord(addressBook,person,&error);// 保存到数据库ABAddressBookSave(addressBook, &error);CFRelease(addressBook);//导航回根视图控制器ViewController
    [self.navigationController popToRootViewControllerAnimated:YES];}
@end

#import <UIKit/UIKit.h>
#import <AddressBook/AddressBook.h>@interface T20140622161906AddViewController : UITableViewController@property (weak, nonatomic) IBOutlet UITextField *txtLastName;
@property (weak, nonatomic) IBOutlet UITextField *txtFirstName;@property (weak, nonatomic) IBOutlet UITextField *txtMobile;
@property (weak, nonatomic) IBOutlet UITextField *txtIPhone;@property (weak, nonatomic) IBOutlet UITextField *txtWorkEmail;
@property (weak, nonatomic) IBOutlet UITextField *txtHomeEmail;- (IBAction)saveClick:(id)sender;
- (IBAction)cancelClick:(id)sender;@end

#import "T20140622161906AddViewController.h"@interface T20140622161906AddViewController ()@end@implementation T20140622161906AddViewController- (id)initWithStyle:(UITableViewStyle)style
{self = [super initWithStyle:style];if (self) {// Custom initialization
    }return self;
}- (void)viewDidLoad
{[super viewDidLoad];// Uncomment the following line to preserve selection between presentations.// self.clearsSelectionOnViewWillAppear = NO;// Uncomment the following line to display an Edit button in the navigation bar for this view controller.// self.navigationItem.rightBarButtonItem = self.editButtonItem;
}- (void)didReceiveMemoryWarning
{[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}- (IBAction)saveClick:(id)sender {CFErrorRef error = NULL;ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);ABRecordRef person = ABPersonCreate();//保存姓名
    ABRecordSetValue(person, kABPersonFirstNameProperty,(__bridge CFTypeRef)self.txtFirstName.text, &error);ABRecordSetValue(person, kABPersonLastNameProperty,(__bridge CFTypeRef)self.txtLastName.text, &error);// 设置电话号码ABMutableMultiValueRef multi = ABMultiValueCreateMutable(kABMultiStringPropertyType);ABMultiValueAddValueAndLabel(multi,  (__bridge CFTypeRef)self.txtMobile.text,kABPersonPhoneMobileLabel, NULL);ABMultiValueAddValueAndLabel(multi,  (__bridge CFTypeRef)self.txtIPhone.text,kABPersonPhoneIPhoneLabel, NULL);// 添加电话号码到记录ABRecordSetValue(person, kABPersonPhoneProperty, multi, &error);CFRelease(multi);// 设置Email属性multi = ABMultiValueCreateMutable(kABMultiStringPropertyType);ABMultiValueAddValueAndLabel(multi,  (__bridge CFTypeRef)self.txtHomeEmail.text,kABHomeLabel, NULL);ABMultiValueAddValueAndLabel(multi,  (__bridge CFTypeRef)self.txtWorkEmail.text,kABWorkLabel, NULL);// 添加Email到记录ABRecordSetValue(person, kABPersonEmailProperty, multi, &error);CFRelease(multi);// 增加记录到数据库ABAddressBookAddRecord(addressBook, person, &error);// 保存到数据库ABAddressBookSave(addressBook, &error);CFRelease(person);CFRelease(addressBook);[self dismissViewControllerAnimated:YES completion:nil];}- (IBAction)cancelClick:(id)sender {[self dismissViewControllerAnimated:YES completion:nil];
}@end

转载于:https://www.cnblogs.com/cqchen/p/3803254.html

iOS.访问通讯录.02.写入联系人相关推荐

  1. iOS从通讯录中选择联系人

    有时候APP需要用户输入一位联系人的姓名和电话,除了用户手动输入,一般也允许用户从通讯录中选择一位联系人(图1),下面的代码就是使用系统的<AddressBookUI/AddressBookUI ...

  2. Swift - 访问通讯录联系人(使用系统提供的通讯录交互界面)

    1,通讯录访问介绍 通讯录(或叫地址簿,电话簿)是一个数据库,里面储存了联系人的相关信息.要实现访问通讯录有如下两种方式: (1)AddressBook.framework框架 : 没有界面,通过代码 ...

  3. IOS如何访问通讯录

    实现方法: [plain] view plaincopy //读取所有联系人 -(void)ReadAllPeoples { //取得本地通信录名柄 ABAddressBookRef tmpAddre ...

  4. 分享了iOS获取通讯录的4种方式

    本文实例为大家分享了iOS获取通讯录的4种方式,供大家参考,具体内容如下 使用场景 一些App通过手机号码来推荐好友,如 微博.支付宝 首先客户端会获取通讯录中的所有手机号然后将这些手机号提交到App ...

  5. ios 绕过mfi_如何让联系人绕过iOS的免打扰模式

    ios 绕过mfi Khamosh Pathak Khamosh Pathak The iPhone's Do Not Disturb feature is a great way to make s ...

  6. Android中访问通讯录,数据的增删改查

    1.权限 <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-pe ...

  7. 关于iOS的通讯录开发权限的说明笔记

    由于接手同事的通讯录相关模块的开发工作,涉及到通讯录权限的确认,故笔记如下:(不涉及代码实现,仅对权限作说明记录) 如下表所示,iOS关于通讯录的开发有两种方式: 由于我们采用的是第一种方式[调用的系 ...

  8. iOS 获取通讯录的4种方式详解

    分享一个朋友的人工智能教程.比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. 使用场景 一些App通过手机号码来推荐好友,如 微博.支付宝 首先客户端会获取通讯录中的所有手机号然后将这些手机号提交到A ...

  9. android通讯录管理(获取联系人,通话记录,短信消息),Android通讯录管理(获取联系人、通话记录、短信消息)(二)...

    Android通讯录管理(获取联系人.通话记录.短信消息)(二) 前言:上一篇博客介绍的是获取联系人的实现,本篇博客将介绍通话记录的实现. 界面布局: /Contact_Demo/res/layout ...

最新文章

  1. 在Ubuntu上安装Snort入侵检测系统。
  2. 他22岁在家自造芯片,性能接近英特尔初代,连光刻机都有解决方案
  3. Exchange server 2003迁移到2010后,手动更新地址列表,提示OAB Versions无效
  4. Windows下Caffe的学习与应用(一)——训练自己的数据模型(GoogleNet)
  5. Koa -- 基于 Node.js 平台的下一代 web 开发框架
  6. 为什么建议学生积极参与开源项目?
  7. DELPHI之常用函数
  8. ionic 上拉加载更多
  9. Redis势不可挡系列之概念剖析
  10. Thumb指令集与ARM指令集的区别
  11. 毕业论文酒店管理系统java,基于J2EE酒店管理系统设计与实现
  12. python 多线程测试_【Python】多线程网站死链检测工具
  13. html网站计数器代码,如何在网站添加计数器代码
  14. windows 2008 server R2 服务器docker安装
  15. 末学者笔记--Python基础三玄
  16. 华为MA5300配置RADIUS认证
  17. 机器学习:kNN算法(一)—— 原理与代码实现(不调用库)
  18. 2022年的ISTQB,你考了没?
  19. Haproxy启动故障:Starting proxy:cannot bind socke
  20. 章泽天加入微软实习 网友:提升程序员整体形象

热门文章

  1. 深入理解Java虚拟机(JVM高级特性与最佳实践java虚拟机)的一些知识总结
  2. startos 5.1 如何 root 登陆
  3. Oracle全文检索示例
  4. 基于xmpp openfire smack开发之smack类库介绍和使用[2]
  5. [Spring Cloud Task]6 Spring Batch批处理应用设计原则
  6. Java Web项目中解决中文乱码方法总结
  7. Npm 包版本知识总结
  8. Activt工作流数据库对应表的作用
  9. maven nexus memory optimization
  10. Apache下PHP的几种工作方式