iPhone应用开发ABAddressBook相关API使用经验

移动开发 iOS
iPhone应用开发ABAddressBook相关API使用经验是本文要介绍的内容,iPhone应用开发时,在 ABAddressBook 通讯录操作时遇到的各种问题与解决方法的知识汇总,来看本文详解

iPhone应用开发ABAddressBook相关API使用经验是本文要介绍的内容,iPhone应用开发时,在 ABAddressBook 通讯录操作时遇到的各种问题与解决方法的知识汇总,十分难得的经验总结。最近在研究这个东西,并且提交了程序。因为用了以下代码而被reject。

1、mABPersonViewController = [[ABPersonViewController alloc] init];

2、[mABPersonViewController setAllowsDeletion:YES];

于是研究自己实现同样功能,于是也发现了API里有问题……

备忘录:

1、不要传递ABRecordRef,要坚持使用RecordID。比如下面代码

  1. ABRecordRef recordRef = ABAddressBookGetPersonWithRecordID(addressBookRef,ABRecordGetRecordID([mPersonViewController displayedPerson])); 

你会发现,recordRef和[mPersonViewController displayedPerson]的地址不一定是相同的。这里mPersonViewController是任何一个 ABPersonViewController的实例,addressBookRef是你正在操作的AddressBook复本。因为它们来自不同的 AddressBook复本,所以地址不同,所以无法相互混用。

2、ABAddressBookHasUnsavedChanges,这 个函数是没有用的,总是返回NO。搜google搜很久了,才发现这个函数原来是无效的。从iPhone OS 2.x版本开始到现在3.x还依然存在这个问题。

3、还有一个bug是,即便我没有用setAllowsDeletion:YES这个非 法设置,使用以下代码时还是可以看到删除联系人的按钮的。

  1. - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker 
  2. shouldContinueAfterSelectingPerson:(ABRecordRef)person{  
  3.         [personViewController setDisplayedPerson:person];  
  4.        [personViewController setEditing:YES];  
  5.         [peoplePicker pushViewController:personViewController animated:YES];  
  6.     }  
  7.    return NO;  

上面代码执 行后,打开的联系人详细信息的界面,是正在编辑的界面,而且底部带有删除按钮……但是,通过任何其他方法都无法实现这个效果。比如点“编辑”按钮 时把当前ABPersonViewController设置成setEditing:YES,是没有删除按钮的……

问题:

因为 ABAddressBookHasUnsavedChanges总是返回NO,所以我通过判断ABAddressBookRemoveRecord是否返 回YES来判断通讯录是否被修改。是的话,直接ABAddressBookSave。

但是,有时候会出现如下错误,google里搜索这个关键词 的结果为0。

  1. sqlite3 error in CPRecordStoreSaveWithPreAndPostCallbacksAndTransactionType: cannot commit - no transaction is active 

后来尝试下面这个之前提到的非法代码,测试后发现,使用官方的“删除联系人”按钮也会有这个错误提示……于是我就纳闷了……不知道大家是怎么解决这个问题的?

1、mABPersonViewController = [[ABPersonViewController alloc] init];

2、[mABPersonViewController setAllowsDeletion:YES];

另外,要避免通讯录整个丢失,我总结的规律是
 
1、必须总是使用同一个AddressBook复本,也就 是说,所操作的ABAddressBookRef地址是同一个。避免创建更多的复本,有时候退出程序时就有可能丢失整个数据库……

2、多线程操作同一个AddressBook复本时,必须避免同时操作。

小结:iPhone应用开发ABAddressBook相关API使用经验的内容介绍完了,希望通过本文的学习能对你有所帮助!

责任编辑:zhaolei 来源: CocoaChina
相关推荐

2011-08-22 14:12:48

iPhone开发NSTableView

2011-08-09 11:36:41

iPhoneUIPickerVieDEMO

2012-04-26 13:45:20

iPhone应用发布税务相关手续

2011-08-08 13:50:29

iPhone开发 NSOperatio 多线程

2011-08-09 13:22:31

iPhoneSqlite数据库

2009-12-31 10:21:53

Silverlight

2011-07-27 10:16:41

iPhone SQLite 数据库

2011-08-08 14:07:49

iPhone开发 字体

2011-08-17 15:10:21

iPhone开发Web视图

2011-07-19 09:46:38

2011-07-19 09:58:36

2011-07-08 14:58:16

iPhone Xcode iOS

2011-08-09 17:29:29

iPhone文件屏幕

2011-08-08 10:10:14

iPhone开发 图片 方法

2011-08-08 16:56:44

iPhone 字符处理 视图

2011-08-10 10:10:21

iPhoneUIPopoverCo

2011-04-02 13:44:08

2011-08-08 14:57:46

iPhone Autoreleas Property

2011-08-05 14:48:06

iPhone应用 异步队列

2011-08-09 13:10:32

iPhone地图开发
点赞
收藏

51CTO技术栈公众号