码迷,mamicode.com
首页 > 其他好文 > 详细

通讯录的初步了解与使用

时间:2015-04-02 11:36:41      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

在开发中我们可能经常碰到需要或许用户的通讯录信息,甚至需要对其进行一些修改操作,那么怎么去获取通讯录呢?我们可以这么想,通讯录保存在手机内就是用一种数据表的形式保存,而我们对通讯录的需求无非就是增删改查,目的很明确,那试试呗,

首先你得引用AddressBook.framework框架,在文件中引用#import <AddressBook/AddressBook.h>,接下来就按照我们操作数据库的思路来走吧,(一开始的时候要判断系统版本,因为ios对通讯录在6.0以上版本做了更好的用户隐私提示,也就是说对6.0以上的要做一个判断,以下的就没那么麻烦了)首先获得一个句柄,ABAddressBookRef ab = ABAddressBookCreateWithOptions(NULL, &error);嗯,这个暂且可以理解为我们所要操作的数据库对象吧(当然,这个实质肯定不是,这么说只是便于理解),因为通讯录属于系统app,所以外部app访问他的话需要获得用户批准,那我们就需要去判断用户是否允许我们访问通讯录,在第一次访问的时候系统会提示你时候允许你访问,

ABAddressBookRequestAccessWithCompletion(ab, ^(BOOL granted,CFErrorRef error){

            if (granted) { //  如果允许访问则进行什么操作        } });

如果您拒绝了那不要紧,你可以在设置中再次允许,如果同意的话,那么在if语句快编写我们所想要的功能,为了保险起见,我们可以在此做下判断,是否真的允许我们访问通讯录,(当然这步并不是必须的),

ABAuthorizationStatus author = ABAddressBookGetAuthorizationStatus();

                if (author != kABAuthorizationStatusAuthorized) {

                    return ;}

做完这个判断你可以安心的做自己想要做的了,到了这里我们相当于将数据表对象获得了,那我们怎么操作数据表的数据呢?那我们来看看数据库操作最常见的五种形式

Insert:做添加我们很清楚流程,获得数据对象,赋值,加入数据表,保存。通讯录也是一样,

    ABRecordRef recordRef= ABPersonCreate();//  数据对象,也就是一个人的通讯信息

    ABRecordSetValue(recordRef, kABPersonFirstNameProperty, (__bridge CFTypeRef)(firstName), NULL);//添加名

           ABRecordSetValue(recordRef, kABPersonLastNameProperty, (__bridge CFTypeRef)(lastName), NULL);//添加姓

    ABMultiValueAddValueAndLabel(multiValueRef, (__bridge CFStringRef)(workNumber), kABWorkLabel, NULL);//添加工作电话

    ABAddressBookAddRecord(ab, recordRef, NULL);//  加入数据表

            ABAddressBookSave(self.addressBook, NULL);//保存通讯录,提交更改

     ok,就这样,我们就简单的添加了一条信息,当然通讯信息远不止这些,看步骤非常简单,其实本来就很简单,想的复杂了就会觉得难而已,

Delete:做添加这么简单,那做删除呢?一样的,但是删除有很多中删除方式,比如依据整体通讯信息来删除,依据姓名来删除,依据号码来删除,等等,只不过是查询条件改变了而已,

    CFStringRef personNameRef=(__bridge CFStringRef)(personName); //  依据姓名来删除,首先需要创建一个通讯属性对象

    CFArrayRef recordsRef= ABAddressBookCopyPeopleWithName(ab, personNameRef);//  然后在通讯录中去匹配姓名属性为personNameRef的数据对象

           CFIndex count= CFArrayGetCount(recordsRef);//很抱歉的是可能重名,所以我们要获得纪录条数

           for (CFIndex i=0; i<count; ++i) {

                    ABRecordRef recordRef=CFArrayGetValueAtIndex(recordsRef, i);//取得指定的记录

                    ABAddressBookRemoveRecord(ab, recordRef, NULL);//删除

           }

          ABAddressBookSave(ab, NULL);//删除之后提交更改

Update:同理更新,依据某种条件获得数据对象,更改对象属性,提交数据,保存数据

    ABRecordRef recordRef=ABAddressBookGetPersonWithRecordID(ab,recordID);//  依据id查找到通讯对象

           ABRecordSetValue(recordRef, kABPersonFirstNameProperty, (__bridge CFTypeRef)(firstName), NULL);//更改名

           ABRecordSetValue(recordRef, kABPersonLastNameProperty, (__bridge CFTypeRef)(lastName), NULL);//更改姓             

           ABMutableMultiValueRef multiValueRef =ABMultiValueCreateMutable(kABStringPropertyType);//  创建一个多值属性对象,这也是通讯对象的一个属性

           ABMultiValueAddValueAndLabel(multiValueRef, (__bridge CFStringRef)(workNumber), kABWorkLabel, NULL);//给这个多值属性对象赋值

           ABRecordSetValue(recordRef, kABPersonPhoneProperty, multiValueRef, NULL);//提交多值属性对象

           ABAddressBookSave(ab, NULL); //保存记录,提交更改

SelectAll:众所周知,查询所有结果是最简单的,这里也不例外

    CFArrayRef allpeople = ABAddressBookCopyArrayOfAllPeople(ab);//  获得所有通讯对象,保存在通讯数组中

           NSArray *BasicDataArray = (__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(ab);//将通讯数组给我门所熟悉的NSArray对象

SelectID:依据条件来查询也是一样的,而且之前的更新操作就已经提到过了,这里就不累赘了。参照一下数据库查询步骤就很明了。

  补充:如果你细心的话你会发现,好像这里大量的用到了__bridge关键字,那他时干什么的呢?从表面来看似乎是转化数据的一种方式。在细心一点你对发现,他所转化的对象全部都是****ref结尾的对象,而实际上以ref结尾的对象都是该数据的指针引用,所以这种数据对象也就不需要*修饰,这种表示方式是c语言的,所以如果要转化为oc对象的话那我们就需要借助__bridge关键字来转化了,同时要说明的是,所有以ref结尾的数据对象都是不受arc管制的,所以你需要对其进行手动管理,

CFRelease(allpeople);//  注销对象

到这里我们对通讯录的操作就基本熟悉了,

 

通讯录的初步了解与使用

标签:

原文地址:http://www.cnblogs.com/xiaojywuxy/p/4386405.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!