ABAddressBook 相关 API 使用经验

发布时间:2012-03-02 13:25:32   来源:文档文库   
字号:

ABAddressBook 相关 API 使用经验

时间: 2010-06-30 10:39 点击: 563

以下是 CocoaChina 会员 bobgreen 总结的自己开发 iPhone 应用时,在 ABAddressBook 通讯录操作时遇到的各种问题与解决方法的知识汇总,十分难得的经验总结。

以下是 CocoaChina 会员 bobgreen 总结的自己开发 iPhone 应用时,在 ABAddressBook 通讯录操作时遇到的各种问题与解决方法的知识汇总,十分难得的经验总结。帖子地址 http://www.cocoachina.com/bbs/read.php?tid-16679.html

最近在研究这个东西,并且提交了程序。因为用了以下代码而被reject
   1. mABPersonViewController = [[ABPersonViewController alloc] init];
   2. [mABPersonViewController setAllowsDeletion:YES];
于是研究自己实现同样功能,于是也发现了API里有问题……

备忘录:

1,不要传递ABRecordRef,要坚持使用RecordID。比如下面代码
  ABRecordRef recordRef = ABAddressBookGetPersonWithRecordID(addressBookRef,ABRecordGetRecordID([mPersonViewController displayedPerson]));

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

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

3,还有一个bug是,即便我没有用setAllowsDeletion:YES这个非 法设置,使用以下代码时还是可以看到删除联系人的按钮的。
 
   1. - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person{
   2.         [personViewController setDisplayedPerson:person];
   3.         [personViewController setEditing:YES];
   4.         [peoplePicker pushViewController:personViewController animated:YES];
   5.     }
   6.     return NO;
   7. }
 
上面代码执 行后,打开的联系人详细信息的界面,是正在编辑的界面,而且底部带有删除按钮……但是,通过任何其他方法都无法实现这个效果。比如点编辑按钮 时把当前ABPersonViewController设置成setEditing:YES,是没有删除按钮的……

问题
因为 ABAddressBookHasUnsavedChanges总是返回NO,所以我通过判断ABAddressBookRemoveRecord是否返 YES来判断通讯录是否被修改。是的话,直接ABAddressBookSave
但是,有时候会出现如下错误,google里搜索这个关键词 的结果为0
sqlite3 error in CPRecordStoreSaveWithPreAndPostCallbacksAndTransactionType: cannot commit - no transaction is active
后来尝试下面这个之前提到的非法代码,测试后发现,使用官方的删除联系人按钮也会有这个错误提示……于是我就纳闷了……不知道大家是怎么解决这个问题的?
   1. mABPersonViewController = [[ABPersonViewController alloc] init];
   2. [mABPersonViewController setAllowsDeletion:YES];

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

本文来源:https://www.2haoxitong.net/k/doc/0a7a4ec289eb172ded63b753.html

《ABAddressBook 相关 API 使用经验.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式