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

 

 

posted @ 2014-06-26 15:59  so_tm_what  阅读(319)  评论(0编辑  收藏  举报