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