iOS-----使用AddressBook管理联系人
使用AddressBook管理联系人
iPhone手机通常都是自带的Contacts应用,包括所有联系人的性(last name)、名(first name)、电话、E-mail地址、住址、生日等各种个人信息.Contacts的数据将保存在自己的应用程序沙盒中,其他应用不能访问它们.
为了能访问iPhone手机存储的联系人信息,iOS系统提供了如下两个框架.
|
AddressBook.framework |
通过该框架提供的系列函数,我们可以开发程序界面对手机中的联系人信息进行增、删、改、查。 |
|
AddressBookUI.framework |
该框架以AddressBook.framework为基础,它直接包含4个视图控制器类以及相应的委托协议.这些特殊的视图控制器提供了默认的用户界面对手机中的联系人信息进行操作,开发者只要创建这些视图控制器的实例并显示出来即可. |
|
下面AddressBook框架的用法 AddressBook框架主要由如下4组API组成 |
|
|
ABAddressBook |
ABAddressBook实例代表地址 簿 对象,该对象提供了一个通用的编程接口,允许我们无须理会联系人信息在底层数据库中的存储方式,直接以透明的方式来访问这些联系人的信息.实际编程时,总是面向ABAddressBook的指针(ABAddressBookRef)编程 |
|
ABRecord |
ABRecord代表一个通用的记录对象,该记录对象包含了大量的通用的数据(如联系人的姓(last name)、名(first name)、电话、邮件等)。 每条记录在底层数据库中都有一个唯一的ID,可通过ABRecordGetRecordID()函数获取指定记录的ID. 可通过ABRecordGetRecordType()函数获取该记录的类型 该记录是联系人,则该函数返回kABPersonType(0)枚举值; 该记录组,则该函数返回kABGroupType(1)枚举值. 实际编程时,总是面向ABRecord的指针(ABRecordRef)编程. |
|
ABPerson |
ABPerson代表联系人信息.通常使用类型为”kABPersonType”的ABRecordRef表示联系人信息.联系人信息存储了该联系人的姓、名、地址、电子邮件和电话号码等,可使用视图控制器(如ABPersonViewController)显示这些联系人信息. |
|
ABGroup |
ABGroup代表组.通常使用类型为”kABGroupType”的ABRecordRef表示组.一个联系人可以属于多个组,一个组也可以包含多个联系人. |
|
ABAddressBook框架,是一种面向过程的操作方式,该框架4组API提供了大量函数. |
|
总结:
ABAddressBook的函数只负责对地址簿进行管理,包括创建地址簿、向地址簿中添加记录、从地址簿中删除记录等。除此之外,还包括判断用户是否允许访问地址簿,以及对地址簿的修改进行保存或丢弃修改。
为了向地址簿中添加记录,或从地址簿中删除记录,都需要使用ABRecordRef,ABRecord所提供的函数主要用于访问ABRecord本身所包含的大量属性。
每个ABRecord由多个属性组成,联系人的姓、名、电话、邮件等都属于ABRecord的属性。
ABRecord提供了如下常用函数。
|
bool ABRecordSetValue(ABRecordRef record,ABPropertyID property, CFTypeRef value, CFErrorRef *error ) |
将record记录中的property属性设为“value”。其中property必须是由ABPerson、ABGroup定义的常量,用于表示预置的各种属性,而且不同属性需要的属性值不同。 联系人的名字,对应于kABPersonFirstNameProperty常量,这种类型的属性只需要字符串值即可; 联系人的电话,对应于kABPersonPhoneProperty常量,这种类型的属性则需要ABMutableMultiValue值. |
|
CFTypeRef ABRecordCopyValue(ABRecordRef record, ABPropertyID property) |
该函数返回record中property属性的值. |
|
bool ABRecordRemoveValue(ABRecordRef record, ABPropertyID property, CFErrorRef *error ) |
该函数删除record记录中property属性的值,返回删除是否成功. |
|
CFStringRef ABRecordCopyCompositeName(ABRecordRef record): |
该函数返回record记录中复合姓名信息(包括姓\名\组织等信息). |
|
ABRecordID ABRecordGetRecordID(ABRecordRef record) |
该函数来获取该记录的ID |
|
ABRecordType ABRecordGetRecordType(ABRecordRef record) |
该函数来获取该记录的类型(联系人记录或组记录) |
总结:
ABRecord的函数主要用于操作记录所包含的属性,如果程序要创建或得到已有的记录,则需要借助于ABPerson、ABGroup提供的函数.
ABPerson提供了大量获取类型为”kABPersonType”的ABRecord的函数,这些函数即可创建一个空的ABRecord,用于向地址簿中添加新的记录,也可从地址薄中获取满足特定条件的ABRecord,包括根据ID获取、根据人名获取等,这些从地址薄中获取的ABRecord可以被删改或修改。
ABGroup提供了大量获取类型为“kABGroupType”的ABRecord的函数,ABGroup包含的函数,既可以创建新的ABRecord,也可从数据库加载ABRecord。
|
ABMutableMultiValue提供了如下常用函数 |
|
|
ABMutableMultiValueRef ABMultiValueCreateMutable(ABPropertyType type): |
创建一个管理ABPropertyType类型的属性值的ABMutableMultiValue |
|
bool ABMultiValueAddValueAndLabel(ABMutableMultiValueRef multiValue, CFTypeRef value, CFStringRef label, ABMultiValueIdentifier *outIdentifier): |
向multiValue中添加一个属性值.value代表属性值,label代表属性值的标签(比如电话号码,可设置”家庭”、“工作”等label) |
|
bool ABMultiValueReplaceValueAtIndex(ABMutableMultiValueRef multiValue, CFTypeRef value, CFIndex index) |
将multiValue中index索引处的属性值替换为新的value |
|
bool ABMultiValueReplaceLabelAtIndex(ABMutableMultiValueRef multiValue,CFStringRef label,CFIndex index) |
将multiValue中index索引处的属性标签替换为新的label |
|
bool ABMultiInsertValueAndLabelAtIndex(ABMutableMultiValueRef multiValue,CFTypeRef value, =CFStringRef label,CFIndex index,ABMultiValueIdentifier *outIdentifier) |
向multiValue的index索引处插入一个属性值.value代表属性值,label代表属性值的标签. |
|
bool ABMultiValueRemoveValueAndLabelAtIndex(ABMutableMultiValueRef multiValue,CFIndex index) |
删除multiValue中index索引处的属性值(同时删除属性值和属性值标签). |
删除联系人
删除联系人很简单,只要如下几步
|
1 |
创建ABAddressBookRef,这就得到了对地址簿的引用 |
|
2 |
获取将要被删除的ABRecordRef,这就得到了要被删除记录的引用 |
|
3 |
调用ABAddressBookRemoveRecord()函数删除指定记录 |
|
4 |
调用ABAddressBookSave()函数将删除操作保存到底层地址簿中 |
|
代码 |
@implementation LCViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (IBAction)deletePerson:(id)sender
{
CFErrorRef error = nil;
// 创建ABAddressBook,该函数的第1参数暂时并未使用,直接传入NULL即可
ABAddressBookRef ab = ABAddressBookCreateWithOptions(NULL, &error);
if(!error)
{
// 请求访问用户地址簿
ABAddressBookRequestAccessWithCompletion(ab, ^(bool granted, CFErrorRef error)
{
// 如果用户允许访问地址簿
if(granted)
{
// 从地址簿中获取ID为3的记录
ABRecordRef rec = ABAddressBookGetPersonWithRecordID(ab, );
BOOL result = ABAddressBookRemoveRecord(ab, rec, NULL);
if(result)
{
// 将程序所做的修改保存到地址簿中,如果保存成功
if(ABAddressBookSave(ab, NULL))
{
[self showAlert:@”成功删除ID为3的联系人”];
}
else
{
[self showAlert:@”保存修改时出现的错误”];
}
}
else
{
[self showAlert:@”删除失败”];
}
}
});
}
}
- (void) showAlert:(NSString*)msg
{
// 使用UIAlertView显示msg信息
[[[UIAlertView alloc] initWithTitle:@”提示” message:msg delegate:nil cancelButtonTitle:@”确定” otherButtonTitles:nil] show];
}
|
iOS-----使用AddressBook管理联系人的更多相关文章
- iOS-----使用addressBook管理联系人之修改联系人
使用addressBook管理联系人之修改联系人 修改联系人 修改联系人先从底层地址簿中加载一条ABRecordRef记录,然后对这条ABRecordRef记录的属性值进行修改,修改完成后把这条修改后 ...
- iOS-----使用AddressBookUI管理联系人
使用AddressBookUI管理联系人 iOS SDK为管理地址簿提供的视图控制器位于AddressBookUI框架内.总结来说,AddressBookUI框架提供了如下特殊的视图控制器. ABPe ...
- iOS-----使用AddressBook添加联系人
使用AddressBook添加联系人 添加联系人的步骤如下: 1 创建ABAddressBookRef,这就得到了对地址簿的引用. 2 调用ABPersonCreate()函数创建一个空的ABReco ...
- 理解 iOS 的内存管理
远古时代的故事 那些经历过手工管理内存(MRC)时代的人们,一定对 iOS 开发中的内存管理记忆犹新.那个时候大约是 2010 年,国内 iOS 开发刚刚兴起,tinyfool 大叔的大名已经如雷贯耳 ...
- iOS ARC内存管理
iOS的内存管理机制,只要是iOS开发者,不管多长的时间经验,都能说出来一点,但是要深入的理解.还是不简单的.随着ARC(自动管理内存)的流行.iOS开发者告别了手动管理内存的复杂工作.但是自动管理内 ...
- android管理联系人操作
ContentProvider扩展之管理系统联系人 我们都知道ContentProvider是用来共享数据的,然而android本身就提供了大量的ContentProvider,例如联系人信息,系统的 ...
- iOS之内存管理(ARC)
iOS的内存管理,相信大家都不陌生,之前是使用的MRC,由开发人员手动来管理内存,后来使用了ARC,来由系统管理内存.本文主要讲讲Autorelease,Core Foundation对象在内存管理方 ...
- IOS开发依赖管理工具CocoaPods
CocoaPods IOS开发依赖管理工具 CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects. It ...
- 说说iOS与内存管理(上)
http://www.cocoachina.com/ios/20150625/12234.html 说起内存管理,看似老生常谈,而真正掌握内存管理的核心其实并不简单.ARC/MRR以及“谁分配谁就负责 ...
随机推荐
- http之http1.0和http1.1的区别
下面主要从几个不同的方面介绍HTTP/1.0与HTTP/1.1之间的差别,当然,更多的内容是放在解释这种差异背后的机制上. 1 可扩展性 可扩展性的一个重要原则:如果HTTP的某个实现接收到了自身未定 ...
- 028-touch命令
1.创建空文件.可以创建一个空文件,也可以批量创建空文件. 2.更改文件/目录的访问时间,如果文件存在就更改访问时间,不存在就创建.# touch -a 3.更改文件的访问时间和修改时间.如果文件存在 ...
- 883. Projection Area of 3D Shapes
问题 NxN个格子中,用1x1x1的立方体堆叠,grid[i][j]表示坐标格上堆叠的立方体个数,求三视图面积. Input: [[1,2],[3,4]] Output: 17 Explanation ...
- 免费美女视频聊天,多人视频会议功能加强版本(Fms3和Flex开发(附源码))
Flex,Fms3系列文章导航 Flex,Fms3相关文章索引 本篇是视频聊天,会议开发实例系列文章的第4篇,该系列所有文章链接如下: http://www.cnblogs.com/aierong/a ...
- ubuntu常用命令解释
1.seq 用于产生一个整数到另一个整数之间所有的整数,如:seq 3 5 输出:3 4 5 注:如果参数为一个整数,则输出1至这个数之间的所有整数 2.tee [-a] file 从标准输入设备读取 ...
- Docker 版本升级
当前系统版本:Centos 7.4 x64 删除老版本docker sudo yum remove docker docker-common docker-selinux docker-engine ...
- 20145312《网络对抗》Exp4 恶意代码分析
20145312<网络对抗>Exp4 恶意代码分析 问题回答 1.总结一下监控一个系统通常需要监控什么.用什么来监控. 监控一个系统通常需要监控这个系统的注册表,进程,开放端口,程序服务还 ...
- QT+VS中ui不能声明为指针?
问题描述:QtCreator里的UI全是默认为指针类型,调用的时候[ui->]但是使用VS+Qt来,发来默认的是变量类型,使用的时候[ui.] 统一:为了统一我把后者声明改为前者 问题:在mai ...
- ubuntu18.04下监视显卡的运行情况【学习笔记】
作者:庄泽彬(欢迎转载,请注明作者) 说明:使用watch命令监听显卡的使用 安装完显卡驱动之后系统会生成nvidia-smi 这个工具,我们只需要配合watch命令就可以周期性的查看显卡的信息,-n ...
- linux下如何kill tty终端
答:一共有两个步骤,如下: 1.列出打开的终端 who 2.kill需要kill的tty终端 pkill -kill -t pts/2