使用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, 3); 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]; } |