【iOS开发-114】ABAddressBook通讯录:增删改查的简单介绍,CF框架于F框架间的转换

(1)导入ABAddressBook库,然后添加头文件后,就可以使用。

——因为这个库的方法基本是C语言的风格,所以类基本是以CF开头的,比如CFStringRef以及CFArrayRef,它和OC的NSString和NSArray类似,可以相互转换,利用__bridge来强制转换,如(__bridge NSString *)XXX,就可以把原本是CFStringRef的XXX转换成NSString类型,这样做的好处就是不需要在很多地方进行释放操作CFRelease()。

——使用通讯录,首先需要发送访问请求,得到请求后,才可以进行一系列操作,访问请求的方法是ABAddressBookRequestAccessWithCompletion,而建议在后续执行一些通讯录操作前可以判断此时我们访问的授权是否还存在,如果用户更改了授权,我们就不必进一步操作,而判断的方法是:

//点击之前,先判断是否被允许
if (ABAddressBookGetAuthorizationStatus()!=kABAuthorizationStatusAuthorized) return;

——除了查询,增加、修改、删除,都需要最终保存通讯录,相当于做一次更新操作。

//保存
ABAddressBookSave(bookRef, NULL);

——删除操作是:

ABAddressBookRemoveRecord(bookRef, people, NULL);

主要代码如下:

#import "ViewController.h"
#import <AddressBook/AddressBook.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //创建3个按钮
    UIButton *btnAccess=[[UIButton alloc]init];
    btnAccess.frame=CGRectMake(20, 40, 280, 30);
    [btnAccess setTitle:@"访问联系人" forState:UIControlStateNormal];
    [btnAccess setBackgroundColor:[UIColor blueColor]];
    [btnAccess addTarget:self action:@selector(btnAccessClick) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btnAccess];

    UIButton *btnUpdate=[[UIButton alloc]init];
    btnUpdate.frame=CGRectMake(20, 80, 280, 30);
    [btnUpdate setTitle:@"更改联系人" forState:UIControlStateNormal];
    [btnUpdate setBackgroundColor:[UIColor blueColor]];
    [btnUpdate addTarget:self action:@selector(btnUpdateClick) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btnUpdate];

    UIButton *btnAdd=[[UIButton alloc]init];
    btnAdd.frame=CGRectMake(20, 120, 280, 30);
    [btnAdd setTitle:@"增加联系人" forState:UIControlStateNormal];
    [btnAdd setBackgroundColor:[UIColor blueColor]];
    [btnAdd addTarget:self action:@selector(btnAddClick) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btnAdd];

    //发送访问通讯录请求
    ABAddressBookRef bookRef=ABAddressBookCreateWithOptions(NULL, NULL);
    ABAddressBookRequestAccessWithCompletion(bookRef, ^(bool granted, CFErrorRef error) {
        if (granted) {
            NSLog(@"可访问");
        }else{
            NSLog(@"不可访问");
        }
    });
    //C语言里create、copy、retain都可以用下面这个来释放
    CFRelease(bookRef);
}

-(void)btnAccessClick{
    //因为是CF框架Core Foundation,所以是C语言的,需要用很多CF类,而且需要释放
//    [self btnAccessClickWithC];
    //部分CF类可以直接用__bridge强制转换成NS类,如数组、字符等,好处是不需要释放
    //在两个框架之间转换用__bridge
    [self btnAccessClickWithOC];
}

-(void)btnAccessClickWithC{
    //点击之前,先判断是否被允许
    if (ABAddressBookGetAuthorizationStatus()!=kABAuthorizationStatusAuthorized) return;
    //获得允许后,获取通讯录里的数据
    ABAddressBookRef bookRef=ABAddressBookCreateWithOptions(NULL, NULL);
    CFArrayRef allPeople=ABAddressBookCopyArrayOfAllPeople(bookRef);
    CFIndex count=CFArrayGetCount(allPeople);
    for (CFIndex i=0; i<count; i++) {
        ABRecordRef people=CFArrayGetValueAtIndex(allPeople, i);
        CFStringRef firstName=ABRecordCopyValue(people, kABPersonFirstNameProperty);
        CFStringRef lastName=ABRecordCopyValue(people, kABPersonLastNameProperty);
        NSLog(@"%@,%@",lastName,firstName);

        ABMultiValueRef phone=ABRecordCopyValue(people, kABPersonPhoneProperty);
        CFArrayRef phones=ABMultiValueCopyArrayOfAllValues(phone);
        CFIndex countPhone=CFArrayGetCount(phones);
        for (int j=0; j<countPhone; j++) {
            CFStringRef phoneType=ABMultiValueCopyLabelAtIndex(phone, j);
            CFStringRef phoneNum=ABMultiValueCopyValueAtIndex(phone, j);
            NSLog(@"%@-%@",phoneType,phoneNum);
            //释放
            CFRelease(phoneType);
            CFRelease(phoneNum);
        }
        //释放
        CFRelease(firstName);
        CFRelease(lastName);
        CFRelease(phones);
        CFRelease(phone);
    }
    //释放
    CFRelease(allPeople);
    //释放
    CFRelease(bookRef);
}

-(void)btnAccessClickWithOC{
    //点击之前,先判断是否被允许
    if (ABAddressBookGetAuthorizationStatus()!=kABAuthorizationStatusAuthorized) return;
    //获得允许后,获取通讯录里的数据
    ABAddressBookRef bookRef=ABAddressBookCreateWithOptions(NULL, NULL);
    NSArray *allPeople=(__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(bookRef);
    for (int i=0; i<allPeople.count; i++) {
        ABRecordRef people=(__bridge ABRecordRef)allPeople[i];
        NSString *firstName=(__bridge NSString *)ABRecordCopyValue(people, kABPersonFirstNameProperty);
        NSString *lastName=(__bridge NSString *)ABRecordCopyValue(people, kABPersonLastNameProperty);
        NSLog(@"%@,%@",lastName,firstName);

        ABMultiValueRef phone=ABRecordCopyValue(people, kABPersonPhoneProperty);
        NSArray *phones=(__bridge NSArray *)ABMultiValueCopyArrayOfAllValues(phone);
        for (int j=0; j<phones.count; j++) {
            NSString *phoneType=(__bridge NSString *)ABMultiValueCopyLabelAtIndex(phone, j);
            NSString *phoneNum=(__bridge NSString *)ABMultiValueCopyValueAtIndex(phone, j);
            NSLog(@"%@-%@",phoneType,phoneNum);
        }
        //释放
        CFRelease(phone);
    }
    //释放
    CFRelease(bookRef);
}

-(void)btnUpdateClick{
    //点击之前,先判断是否被允许
    if (ABAddressBookGetAuthorizationStatus()!=kABAuthorizationStatusAuthorized) return;
    //获得允许后,获取通讯录里的数据
    ABAddressBookRef bookRef=ABAddressBookCreateWithOptions(NULL, NULL);
    NSArray *allPeople=(__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(bookRef);
    //拿到第1条数据
    ABRecordRef people=(__bridge ABRecordRef)allPeople[0];
    //修改
    ABRecordSetValue(people, kABPersonLastNameProperty, ((__bridge CFStringRef)@"司马"), NULL);
    //所有的增删改最终都需要调用save保存方法
    ABAddressBookSave(bookRef, NULL);
    //释放
    CFRelease(bookRef);
}

-(void)btnAddClick{
    //点击之前,先判断是否被允许
    if (ABAddressBookGetAuthorizationStatus()!=kABAuthorizationStatusAuthorized) return;
    //获得允许后,获取通讯录,需要把联系人加到这个通讯录里,所以需要创建这个
    ABAddressBookRef bookRef=ABAddressBookCreateWithOptions(NULL, NULL);
    //创建一个联系人
    ABRecordRef people=ABPersonCreate();
    //设置联系人的数据
    ABRecordSetValue(people, kABPersonLastNameProperty, ((__bridge CFStringRef)@"诸葛"), NULL);
    ABRecordSetValue(people, kABPersonFirstNameProperty, ((__bridge CFStringRef)@"亮"), NULL);

    ABMultiValueRef phone=ABMultiValueCreateMutable(kABMultiStringPropertyType);
    ABMultiValueAddValueAndLabel(phone, ((__bridge CFStringRef)@"10086"), kABPersonPhoneMainLabel, NULL);
    ABMultiValueAddValueAndLabel(phone, ((__bridge CFStringRef)@"13514678920"), kABPersonPhoneMobileLabel, NULL);
    ABRecordSetValue(people, kABPersonPhoneProperty, phone, NULL);

    //添加联系人
    ABAddressBookAddRecord(bookRef, people, NULL);

    //保存
    ABAddressBookSave(bookRef, NULL);

    //释放
    CFRelease(phone);
    CFRelease(people);
    CFRelease(bookRef);
}

@end
时间: 2024-08-30 09:46:30

【iOS开发-114】ABAddressBook通讯录:增删改查的简单介绍,CF框架于F框架间的转换的相关文章

iOS开发之数据库:增删改查

如何导入数据库? 首先要链接库,点击工程??选择Build Phases 下方有个Link Binary,点+ 搜索sqlite,选择libsqlite3.tbd ranh

iOS开发之数据库:增删改查之改、删

//修改学生数据 func updateStudents(){ //准备sql语句 let string:NSString = "update Student set score = 100 where name like 'a%'" let sql = string.UTF8String //执行sql语句 if sqlite3_exec(db, sql, nil, nil, nil) != SQLITE_OK { sqlite3_close(db) print("upda

IOS开发中使用CNContact对通讯录增删改查

IOS开发中使用CNContact对通讯录增删改查 首先当然是把CNcontact包含在工程中: 1 @import Contacts; 1.下面是增加联系人的程序段: 1 CNMutableContact * contact = [[CNMutableContact alloc]init]; 2 contact.imageData = UIImagePNGRepresentation([UIImage imageNamed:@"22"]); 3 //设置名字 4 contact.gi

C# 对MongoDB 进行增删改查的简单操作

C# 对MongoDB 进行增删改查的简单操作 下面演示下C#操作MongoDB驱动的简单的增删改查代码 运用到的MongoDB支持的C#驱动,当前版本为1.6.0 下载地址:https://github.com/mongodb/mongo-csharp-driver/downloads 1,连接数据库 /// <summary> /// 数据库连接 /// </summary> private const string conn = "mongodb://127.0.0

iOS开发UI篇—DatePicker和UIToolBar控件简单介绍

iOS开发UI篇—DatePicker和UIToolBar控件简单介绍 一.Date Picker控件 1.简单介绍: Date Picker显示时间的控件 有默认宽高,不用设置数据源和代理 如何改成中文的? (1)查看当前系统是否为中文的,把模拟器改成是中文的 (2)属性,locale选择地区 如果默认显示不符合需求.时间有四种模式可以设置,在model中进行设置 时间可以自定义(custom). 设置最小时间和最大时间,超过就会自动回到最小时间. 最大的用途在于自定义键盘:弹出一个日期选择器

iOS开发UI篇—多控制器和导航控制器简单介绍

iOS开发UI篇—多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个view时,可以用一个大的view去管理1个或者多个小view,控制器也是如此,用1个控制器去管理其他多个控制器 比如,用一个控制器A去管理3个控制器B.C.D.控制器A被称为控制器B.C.D的“父控制器”:控制器B.C.D的被称为控制器A的“子控制器” 为了便于管理控制器,iOS提供了2个比较特殊的控

快速开发:单表增删改查

EOS快速开发提供了一键生成代码向导,通过功能向导可生成JSP页面.以及业务逻辑代码. 下面就以单表的简单操作为例,介绍EOS快速开发. 在Web页面上展现数据库中的一张表,实现了对单表的数据库查询.增加与删除功能操作,并且实现了分页查询,效果如下图所示. 一.效果图 1. 查询与结果效果图 2. 录入与修改表单效果图 二.创建数据模型 1. 右键点击"资源管理器"视图中,用户创建的构件包下的"数据/数据模型"节点,选择[创建/数据集]菜单,如下图所示,创建一个名为

模拟admin组件自己开发stark组件之增删改查

增删改查,针对视图 我们需要modelform来创建,可自动生成标签,我们还要考虑用户是不是自己定制,依然解决方法是,继承和重写 app01下的joker.py文件 class BookModelForm(ModelForm): class Meta: model = models.Book fields = "__all__" error_messages={ "title":{"required":"该字段不能为空"} }

微软Connect教程系列--自动生成增删改查页面工具介绍(二)

本章课程描述了vs2015的三个特点,其中主要将描述在vs2015下面,使用命令自动生成增删改查界面,具体如下: 1.web.config文件不在存在,用config.json替代,以适应支撑vs的插件化. 即config.json可以在项目中不存在,你可以用xml文件或其他方式创建数据库连接. 2.获取nuget包更便捷 打开project.json,在dependencies节点输入“Newtonsoft.json”,并选择好相应版本,保存后,vs的引用就会自动从nuget上下载newton