iPhone應用開發(fā)ABAddressBook相關API使用經驗
iPhone應用開發(fā)ABAddressBook相關API使用經驗是本文要介紹的內容,iPhone應用開發(fā)時,在 ABAddressBook 通訊錄操作時遇到的各種問題與解決方法的知識匯總,十分難得的經驗總結。最近在研究這個東西,并且提交了程序。因為用了以下代碼而被reject。
1、mABPersonViewController = [[ABPersonViewController alloc] init];
2、[mABPersonViewController setAllowsDeletion:YES];
于是研究自己實現(xiàn)同樣功能,于是也發(fā)現(xiàn)了API里有問題……
備忘錄:
1、不要傳遞ABRecordRef,要堅持使用RecordID。比如下面代碼
- ABRecordRef recordRef = ABAddressBookGetPersonWithRecordID(addressBookRef,ABRecordGetRecordID([mPersonViewController displayedPerson]));
你會發(fā)現(xiàn),recordRef和[mPersonViewController displayedPerson]的地址不一定是相同的。這里mPersonViewController是任何一個 ABPersonViewController的實例,addressBookRef是你正在操作的AddressBook復本。因為它們來自不同的 AddressBook復本,所以地址不同,所以無法相互混用。
2、ABAddressBookHasUnsavedChanges,這 個函數(shù)是沒有用的,總是返回NO。搜google搜很久了,才發(fā)現(xiàn)這個函數(shù)原來是無效的。從iPhone OS 2.x版本開始到現(xiàn)在3.x還依然存在這個問題。
3、還有一個bug是,即便我沒有用setAllowsDeletion:YES這個非 法設置,使用以下代碼時還是可以看到刪除聯(lián)系人的按鈕的。
- - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker
- shouldContinueAfterSelectingPerson:(ABRecordRef)person{
- [personViewController setDisplayedPerson:person];
- [personViewController setEditing:YES];
- [peoplePicker pushViewController:personViewController animated:YES];
- }
- return NO;
- }
上面代碼執(zhí) 行后,打開的聯(lián)系人詳細信息的界面,是正在編輯的界面,而且底部帶有刪除按鈕……但是,通過任何其他方法都無法實現(xiàn)這個效果。比如點“編輯”按鈕 時把當前ABPersonViewController設置成setEditing:YES,是沒有刪除按鈕的……
問題:
因為 ABAddressBookHasUnsavedChanges總是返回NO,所以我通過判斷ABAddressBookRemoveRecord是否返 回YES來判斷通訊錄是否被修改。是的話,直接ABAddressBookSave。
但是,有時候會出現(xiàn)如下錯誤,google里搜索這個關鍵詞 的結果為0。
- sqlite3 error in CPRecordStoreSaveWithPreAndPostCallbacksAndTransactionType: cannot commit - no transaction is active
后來嘗試下面這個之前提到的非法代碼,測試后發(fā)現(xiàn),使用官方的“刪除聯(lián)系人”按鈕也會有這個錯誤提示……于是我就納悶了……不知道大家是怎么解決這個問題的?
1、mABPersonViewController = [[ABPersonViewController alloc] init];
2、[mABPersonViewController setAllowsDeletion:YES];
另外,要避免通訊錄整個丟失,我總結的規(guī)律是
1、必須總是使用同一個AddressBook復本,也就 是說,所操作的ABAddressBookRef地址是同一個。避免創(chuàng)建更多的復本,有時候退出程序時就有可能丟失整個數(shù)據庫……
2、多線程操作同一個AddressBook復本時,必須避免同時操作。
小結:iPhone應用開發(fā)ABAddressBook相關API使用經驗的內容介紹完了,希望通過本文的學習能對你有所幫助!