iPhone应用开发ABAddressBook相关API使用经验是本文要介绍的内容,iPhone应用开发时,在 ABAddressBook 通讯录操作时遇到的各种问题与解决方法的知识汇总,十分难得的经验总结。最近在研究这个东西,并且提交了程序。因为用了以下代码而被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这个非 法设置,使用以下代码时还是可以看到删除联系人的按钮的。
- - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker
- shouldContinueAfterSelectingPerson:(ABRecordRef)person{
- [personViewController setDisplayedPerson:person];
- [personViewController setEditing:YES];
- [peoplePicker pushViewController:personViewController animated:YES];
- }
- return NO;
- }
上面代码执 行后,打开的联系人详细信息的界面,是正在编辑的界面,而且底部带有删除按钮……但是,通过任何其他方法都无法实现这个效果。比如点“编辑”按钮 时把当前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复本时,必须避免同时操作。
小结:iPhone应用开发ABAddressBook相关API使用经验的内容介绍完了,希望通过本文的学习能对你有所帮助!