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

首先你得引用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);//  注销对象

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

转载于:https://www.cnblogs.com/xiaojywuxy/p/4386405.html

通讯录的初步了解与使用相关推荐

  1. c语言个人通讯录管理系统实验报告_C语言实现个人通讯录管理系统

    如何用c语言制作简易的个人通讯录管理系统?想必这是每一位初步学习c语言的同学需要解决的一个大问题.如何将这些数据类型不完全相同的数据元素存储并访问呢?采用结构体便能轻松解决这个问题! #include ...

  2. Android 绿豆通讯录【 SQLite数据库(增删改查、展示数据) + ListView数据展示控件(展示所有数据) 】

    前情提要:Android 数据库(SQLite) [简介.创建.使用(增删改查.事务.实战演练).数据显示控件(ListView.Adapter.实战演练-绿豆通讯录)] https://blog.c ...

  3. Jquery Mobile设计Android通讯录第二章

    本文是jQuery Mobile设计Android通讯录系统教程的第二篇,在上一篇教程中(http://publish.itpub.net/a2011/0517/1191/000001191561.s ...

  4. 建立一个通讯录的结构记录,包括姓名、年龄、电话号码

    [问题描述]建立一个通讯录的结构记录,包括姓名.年龄.电话号码.输n(n<10)个朋友的信息,再按他们的年龄从大到小的顺序依次输出其信息. [输入形式]先输入n,再依次输入n个人的信息 [输出形 ...

  5. php 126邮箱 联系人,php curl 获取 邮箱通讯录 126

    /** * author : 郭钱 * */ error_reporting(0); define("COOKIEJAR", tempnam("./assets/tmp& ...

  6. [学习笔记] Cordova+AmazeUI+React 做个通讯录 - 使用 SQLite

    [学习笔记] Cordova+AmazeUI+React 做个通讯录 系列文章 目录 准备 联系人列表(1) 联系人列表(2) 联系人详情 单页应用 (With Router) 使用 SQLite 传 ...

  7. 简易android通讯录

    android通讯录 文章目录 android通讯录 (1)初步实现的功能: (2)主界面布局 (3)设计思路 (4)开发技术 (5)核心方面 5.1数据库设计方面 5.2JavaBean 5.3Ar ...

  8. 【C语言进阶】C语言实现通讯录

    目录 一.引言 二.如何实现通讯录 1.通讯录要求 2.创建主菜单 3.初步设置主函数 4.创建通讯录 5.初始化通讯录 6.case 1(增加联系人) 7.case 5(显示通讯录中的信息) 8.c ...

  9. C语言制作通讯录(新手练习推荐)

    本博客推荐给C语言学习到结构体的新手们,供其练习.建议新手读者在阅读之后,仔细分析原码,再独立完成程序编写. 一.本通讯录要实现的功能: 通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名. ...

最新文章

  1. CV之路 —— Opencv学习
  2. java提高篇之数组(1):认识JAVA数组
  3. golang基本数据类型默认值
  4. 清华计算机学院吴建平,吴建平
  5. 【Android】安装时, 先拷so主目录(当前设备相关),再拷so次目录,不重复拷贝 (armeabi/armeabi-v7a) arm-v7不兼容arm-v5
  6. 4. linux调用文件计算阶乘前5项和_嵌入式Linux系统编程——文件读写访问、属性、描述符、API
  7. Ubuntu安装sciki-learn及环境
  8. java窗口小程序atm_简单的小程序实现ATM机操作
  9. iOS:菜单控制器和菜单项:UIMenuController和UIMenuItem
  10. 数论基础及其代码实现
  11. PLC振荡电路——控制灯闪烁
  12. 使用Google身份验证进行ssh二次验证
  13. python求音频的梅尔倒谱系数
  14. 我们不一样!告诉你百度是如何做智能流量异常检测的
  15. chromium 46 编译chromium老版本流程
  16. Specular/Glossiness传统材质简单转换金属度流程材质metallic/roughness小记
  17. 中英文说明书丨ProSci LAG-3 重组蛋白
  18. 按键精灵sub子程序篇
  19. 微信小程序--四色花瓣
  20. 什么是雪崩什么是击穿?

热门文章

  1. Gray Code LeetCode 89
  2. 计时器Chronometer和时钟(AnalogClock和DigitalClock)
  3. @ 在 C# string 中的用法
  4. java实现https免证书认证
  5. windows查看文件MD5值
  6. 解决MVN install一直处于下载jar包等待问题
  7. Sublime Text 3103 Crack 破解 注册码(亲测有效)
  8. Android开源项目--分类汇总
  9. 无法安装声卡及MODEM驱动
  10. 艰难的原创——谈互联网创业