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复本,所以地址不同,所以无法相互混用。2,ABAddressBookHasUnsavedChanges,这 个函数是没有用的,总是返回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
文档为doc格式