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

来源:互联网 发布:网络研修收获 编辑:程序博客网 时间:2024/05/21 06:17

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使用经验的内容介绍完了,希望通过本文的学习能对你有所帮助!

转载自:http://mobile.51cto.com/iphone-285012.htm

0 0
原创粉丝点击