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使用經驗的內容介紹完了,希望通過本文的學習能對你有所協助!