通讯录相关(编辑)

通讯录联系人相关的应用iPhone提供了两个框架:AddressBook.framework和AddressBookUI.framework,使用这两个框架我们可以在程序中访问并显示iPhone数据库中的联系人信息。


  1. ABAddressBookRef addressBook = nil;  

  2.               

  3.             addressBook = ABAddressBookCreateWithOptions(NULLNULL);  

  4.             //等待同意后向下执行  

  5.             dispatch_semaphore_t sema = dispatch_semaphore_create(0);  

  6.             ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error)  

  7.                                                      {  

  8.                                                          dispatch_semaphore_signal(sema);  

  9.                                                      });  

  10.             dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);  




  1. //获取本地通讯录数据库  

  2.   ABRecordRef moi=NULL;//联系人  

  3.   ABRecordRef annkey=ABPersonCreate();//创建联系人  

  4.   //设置联系人的值  

  5.   ABRecordSetValue(annkey,kABPersonFirstNameProperty,@"annkey",NULL);  

  6.   ABRecordSetValue(annkey,kABPersonLastNameProperty,@"hu",NULL);  

  7.   //创建多值属性  

  8.   ABMutableMultiValueRef addr=ABMultiValueCreateMutable(kABStringPropertyType);  

  9.   //增加属性名和属性值,属性名为kABHomeLabel  

  10.   ABMultiValueAddValueAndLabel(addr,@"[email protected]",kABHomeLabel,NULL);  

  11.   //设置联系人的多值邮箱属性  

  12.   ABRecordSetValue(annkey,kABPersonEmailProperty, addr,NULL);  

  13.   ABAddressBookAddRecord(adbk, annkey,NULL);//增加联系人  

  14.   ABAddressBookSave(adbk,NULL);//保存联系人  

  15.   CFRelease(addr);  

  16.   CFRelease(annkey);//,即使是在arc机制里,c对象仍需手动释放  

  17.   CFArrayRef sams=ABAddressBookCopyPeopleWithName(adbk, (CFStringRef)@"hu");//联系人数组,可能存在多个同名的联系人,需要通过其他属性来判断具体是哪个  

  18.   for (CFIndex ix=0; ix  

  19.   // 从联系人数组多个sam中读取  

  20.   ABRecordRef sam=CFArrayGetValueAtIndex(sams, ix);  

  21.   // 获取联系人的名属性  

  22.   CFStringRef last=ABRecordCopyValue(sam,kABPersonLastNameProperty);  

  23.   NSLog(@" is find %@",last);  

  24.   //找到符合条件的联系人  

  25.   if (last&&CFStringCompare(last, (CFStringRef)@"annkey",0)==0) {  

  26.   moi=sam;  

  27.   }  

  28.   if (last) {  

  29.   //必须要判断cf对象是否为空,只有不是null才可被释放,如果不判断会报错。  

  30.   CFRelease(last); //c对象需手动释放  

  31.   }  

  32.   }  

  33.   if (NULL==moi) {  

  34.   //此处通讯录肯定不为空,数据库是存在的  

  35.   CFRelease(sams);  

  36.   CFRelease(adbk);//c对象需手动释放  

  37.   return;  

  38.   }  

  39.   //获取联系人的邮件属性,初始化为多值  

  40.   ABMultiValueRef emails=ABRecordCopyValue(moi,kABPersonEmailProperty);  

  41.   if (NULL==emails) {  

  42.   NSLog(@"emails is null");  

  43.   }  

  44.   for (CFIndex ix=0; ix  

  45.   //联系人的属性名和属性值  

  46.   CFStringRef labe1=ABMultiValueCopyLabelAtIndex(emails, ix);  

  47.   CFStringRef value=ABMultiValueCopyValueAtIndex(emails, ix);  

  48.   NSLog(@"i have a %@ address I%@",labe1,value);  

  49.   CFRelease(labe1);  

  50.   CFRelease(value);  

  51.   }  

  52.   NSLog(@"emails is null2");  

  53.   CFRelease(emails);  

  54.   CFRelease(sams);  

  55.   CFRelease(adbk);  


对通讯录进行编辑

............,....,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

IOS编程:Address Book

在IOS中,允许用户对Address Book(地址簿)进行添加、编辑与删除操作。地址簿可以是一些人的集合,也可以是一系列群组的集合。里面的每一个人都有诸如姓氏、名字、电话号码、电子邮件等一系列属性。这些属性可以只有一个值,当然也可以有多个值,列入,一个人的姓氏只能有一个值,而他/她的电话号码却可以有多个值。

IOS SDK中的AddressBook.Framwork框架允许我们与iOS设备的地址簿数据库进行交互,我们可以通过它取得地址簿上所有人的相关信息,也可以对其中的一条或者多条数据进行查询、删除等操作。

为在应用程序中使用地址簿相关的函数,需要将地址簿框架添加到我们的应用程序中:

  1. 单击Xcode中的工程图标

  2. 选择欲添加地址簿框架的目标

  3. 选择屏幕顶部的Build Phases选项卡

  4. 在Build Phases选项卡中,找到并展开Link Binary选项,单击底部左下角的“+”按钮

  5. 在弹出的库列表中,选中AddressBook.Framwork,点击添加按钮即可

添加地址簿框架后,我们还需要在工程中添加相应的头文件:#import<AddressBook/AddressBook.h>

查询

要进行地址簿的查询操作,首先要使用 ABAddressBookCreate函数创建一个地址簿数据库的引用,该函数返回一个ABAddressBookRef类型的值,如果地址簿数据库不能访问的话,则返回nil。在进行任何地址簿的操作之前,必须检查改制是否为nil,否者,当应用程序试图去编辑一个空的地址簿是,将会以一个运行时错误退出程序。

在取得地址簿引用后,就可以对地址簿进行查询、编辑等操作了,但需要注意的是,一旦你对地址簿进行任何改变,ABAddressBookHasUnsavedChanges函数将返回一个YES值以告知地址簿发生变化了,此时,你可以使用ABAddressBookSave函数或者ABAddressBookRevert函数来保存或者忽略地址簿的变化。

接下来,调用ABAddressBookCopyArrayOfAllPeople函数来得到地址簿中的所有联系人信息,该函数的返回值是一个CFArrayRef类型的数组。之后遍历该数组,调用ABRecoredCopyValue函数便可得到每个联系人的相关信息。它包含两个参数,第一个参数是地址簿记录应用(ABRecordRef),第二个参数指定了你想要获得何种信息。例如,如果想要查询邮件地址,则第二个参数为kABPersonEmailProperty。当然,如果不想自己创建界面去展示这些内容时,我们还可以使用IOS SDK自带的ABPersonViewController(需要引入AddressBookUI.Framwork框架和添加ABPersonViewControllerDeleagte)来展示和编辑联系人的相关信息。示例代码如下:


  ABAddressBookRef abRef = ABAddressBookCreate();

if(abRef != nil){

allarray = (__bridge_transfer NSArray *)ABAddressBookCopyArrayOfAllPeople(abRef);

}

CFRelease(abRef);




  ABRecordRef person = [allarray objectAtIndex:[indexPath row]];

cell.textLabel.text = [[[NSString alloc] initWithFormat:@”%@%@”, (__bridge_transfer NSString *)ABRecordCopyValue(person,kABPersonFirstNameProperty), (__bridge_transfer NSString*)ABRecordCopyValue(person, kABPersonLastNameProperty)] autorelease];



  ABPersonViewController *personView = [[ABPersonViewController alloc]init];

personView.personViewDelegate = self;

personView.displayedPerson = [allarray objectAtIndex:row];

personView.allowsEditing = YES//是否允许编辑

[self.navigationController pushViewController:personView animated:YES];

[personView release];


编辑

除了调用ABPersonViewController编辑联系人外,还可以使用ABRecordSetValue函数和ABAddressBookAddRecord函数来添加或者修改联系人信息。或者使用IOS SDK自带的ABNewPersonViewController(需要引入AddressBookUI.Framwork框架和添加ABNewPersonViewControllerDeleagte)来添加一个新的联系人,但是别忘记实现相应的代理方法,否则程序会崩溃退出。


  ABAddressBookRef abRef = ABAddressBookCreate();



  CFErrorRef errorRef = NULL;

ABRecordSetValue(abRef,kABPersonFirstNameProperty,(__bridgeCFTypeRef)@”HamGuy”,&errorRef);

ABRecordSetValue(abRef,kABPersonEmailProperty,(__bridgeCFTypeRef)@”[email protected],&errorRef);


ABRecordRef person = [allarray objectAtIndex:[indexPath row]];

ABAddressBookAddRecord(abRef, person, &errorRef);




  ABNewPersonViewController *newPersonView = [[ABNewPersonViewControlleralloc] init];

newPersonView.newPersonViewDelegate = self;

  

UINavigationController *newNavigationController = [[UINavigationControlleralloc]

   initWithRootViewController:newPersonView];

[self presentModalViewController:newNavigationController animated:YES];

[newPersonView release];

[newNavigationController release];



-(void) newPersonViewController:(ABNewPersonViewController *)newPersonView didCompleteWithNewPerson:(ABRecordRef)person{

[newPersonView dismissModalViewControllerAnimated:YES];

}

删除

删除联系人使用ABAddressBookRemoveRecord函数来实现,用法与ABAddressBookAddRecord函数类似,不在赘述。如果要清空地址簿的话,可循环调用该方法实现。

  ABAddressBookRef abRef = ABAddressBookCreate();

if(abRef == nil)

return;

  

CFErrorRef errorRef = NULL;

ABAddressBookRemoveRecord(abRef,[allarray objectAtIndex:[indexPathrow]],&errorRef);


你可能感兴趣的:(通讯录,编辑)