iOS.访问通讯录.02.写入联系人
一、创建联系人
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