iOS-----使用AddressBook管理連絡人,iosaddressbook
使用AddressBook管理連絡人
iPhone手機通常都是內建的Contacts應用,包括所有連絡人的性(last name)、名(first name)、電話、E-mail地址、住址、生日等各種個人資訊.Contacts的資料將儲存在自己的應用程式沙箱中,其他應用不能訪問它們.
為了能訪問iPhone手機儲存的連絡人資訊,iOS系統提供了如下兩個架構.
AddressBook.framework |
通過該架構提供的系列函數,我們可以開發程式介面對手機中的連絡人資訊進行增、刪、改、查。 |
AddressBookUI.framework |
該架構以AddressBook.framework為基礎,它直接包含4個視圖控制器類以及相應的委託協議.這些特殊的視圖控制器提供了預設的使用者介面對手機中的連絡人資訊進行操作,開發人員只要建立這些視圖控制器的執行個體並顯示出來即可. |
下面AddressBook架構的用法 AddressBook架構主要由如下4組API組成 |
ABAddressBook |
ABAddressBook執行個體代表地址 簿 對象,該對象提供了一個通用的編程介面,允許我們無須理會連絡人資訊在底層資料庫中的儲存方式,直接以透明的方式來訪問這些連絡人的資訊.實際編程時,總是面向ABAddressBook的指標(ABAddressBookRef)編程 |
ABRecord |
ABRecord代表一個通用的記錄對象,該記錄對象包含了大量的通用的資料(如連絡人的姓(last name)、名(first name)、電話、郵件等)。 每條記錄在底層資料庫中都有一個唯一的ID,可通過ABRecordGetRecordID()函數擷取指定記錄的ID. 可通過ABRecordGetRecordType()函數擷取該記錄的類型 該記錄是連絡人,則該函數返回kABPersonType(0)枚舉值; 該記錄組,則該函數返回kABGroupType(1)枚舉值. 實際編程時,總是面向ABRecord的指標(ABRecordRef)編程. |
ABPerson |
ABPerson代表連絡人資訊.通常使用類型為”kABPersonType”的ABRecordRef表示連絡人資訊.連絡人資訊儲存了該連絡人的姓、名、地址、電子郵件和電話號碼等,可使用視圖控制器(如ABPersonViewController)顯示這些連絡人資訊. |
ABGroup |
ABGroup代表組.通常使用類型為”kABGroupType”的ABRecordRef表示組.一個連絡人可以屬於多個組,一個組也可以包含多個連絡人. |
ABAddressBook架構,是一種面向過程的操作方式,該架構4組API提供了大量函數. |
總結:
ABAddressBook的函數只負責對地址簿進行管理,包括建立地址簿、向地址簿中添加記錄、從地址簿中刪除記錄等。除此之外,還包括判斷使用者是否允許訪問地址簿,以及對地址簿的修改進行儲存或丟棄修改。
為了向地址簿中添加記錄,或從地址簿中刪除記錄,都需要使用ABRecordRef,ABRecord所提供的函數主要用於訪問ABRecord本身所包含的大量屬性。
每個ABRecord由多個屬性群組成,連絡人的姓、名、電話、郵件等都屬於ABRecord的屬性。
ABRecord提供了如下常用函數。
bool ABRecordSetValue(ABRecordRef record,ABPropertyID property, CFTypeRef value, CFErrorRef *error ) |
將record記錄中的property屬性設為“value”。其中property必須是由ABPerson、ABGroup定義的常量,用於表示預置的各種屬性,而且不同屬性需要的屬性值不同。 連絡人的名字,對應於kABPersonFirstNameProperty常量,這種類型的屬性只需要字串值即可; 連絡人的電話,對應於kABPersonPhoneProperty常量,這種類型的屬性則需要ABMutableMultiValue值. |
CFTypeRef ABRecordCopyValue(ABRecordRef record, ABPropertyID property) |
該函數返回record中property屬性的值. |
bool ABRecordRemoveValue(ABRecordRef record, ABPropertyID property, CFErrorRef *error ) |
該函數刪除record記錄中property屬性的值,返回刪除是否成功. |
CFStringRef ABRecordCopyCompositeName(ABRecordRef record): |
該函數返回record記錄中複合姓名資訊(包括姓\名\組織等資訊). |
ABRecordID ABRecordGetRecordID(ABRecordRef record) |
該函數來擷取該記錄的ID |
ABRecordType ABRecordGetRecordType(ABRecordRef record) |
該函數來擷取該記錄的類型(連絡人記錄或組記錄) |
總結:
ABRecord的函數主要用於操作記錄所包含的屬性,如果程式要建立或得到已有的記錄,則需要藉助於ABPerson、ABGroup提供的函數.
ABPerson提供了大量擷取類型為”kABPersonType”的ABRecord的函數,這些函數即可建立一個空的ABRecord,用於向地址簿中添加新的記錄,也可從地址薄中擷取滿足特定條件的ABRecord,包括根據ID擷取、根據人名擷取等,這些從地址薄中擷取的ABRecord可以被刪改或修改。
ABGroup提供了大量擷取類型為“kABGroupType”的ABRecord的函數,ABGroup包含的函數,既可以建立新的ABRecord,也可從資料庫載入ABRecord。
ABMutableMultiValue提供了如下常用函數 |
ABMutableMultiValueRef ABMultiValueCreateMutable(ABPropertyType type): |
建立一個管理ABPropertyType類型的屬性值的ABMutableMultiValue |
bool ABMultiValueAddValueAndLabel(ABMutableMultiValueRef multiValue, CFTypeRef value, CFStringRef label, ABMultiValueIdentifier *outIdentifier): |
向multiValue中添加一個屬性值.value代表屬性值,label代表屬性值的標籤(比如電話號碼,可設定”家庭”、“工作”等label) |
bool ABMultiValueReplaceValueAtIndex(ABMutableMultiValueRef multiValue, CFTypeRef value, CFIndex index) |
將multiValue中index索引處的屬性值替換為新的value |
bool ABMultiValueReplaceLabelAtIndex(ABMutableMultiValueRef multiValue,CFStringRef label,CFIndex index) |
將multiValue中index索引處的屬性標籤替換為新的label |
bool ABMultiInsertValueAndLabelAtIndex(ABMutableMultiValueRef multiValue,CFTypeRef value, =CFStringRef label,CFIndex index,ABMultiValueIdentifier *outIdentifier) |
向multiValue的index索引處插入一個屬性值.value代表屬性值,label代表屬性值的標籤. |
bool ABMultiValueRemoveValueAndLabelAtIndex(ABMutableMultiValueRef multiValue,CFIndex index) |
刪除multiValue中index索引處的屬性值(同時刪除屬性值和屬性值標籤). |
刪除連絡人
刪除連絡人很簡單,只要如下幾步
1 |
建立ABAddressBookRef,這就得到了對地址簿的引用 |
2 |
擷取將要被刪除的ABRecordRef,這就得到了要被刪除記錄的引用 |
3 |
調用ABAddressBookRemoveRecord()函數刪除指定記錄 |
4 |
調用ABAddressBookSave()函數將刪除操作儲存到底層地址簿中 |
代碼 |
@implementation LCViewController- (void)viewDidLoad{ [super viewDidLoad];} - (IBAction)deletePerson:(id)sender{ CFErrorRef error = nil; // 建立ABAddressBook,該函數的第1參數暫時並未使用,直接傳入NULL即可ABAddressBookRef ab = ABAddressBookCreateWithOptions(NULL, &error);if(!error){ // 請求訪問使用者地址簿ABAddressBookRequestAccessWithCompletion(ab, ^(bool granted, CFErrorRef error){ // 如果使用者允許訪問地址簿if(granted){ // 從地址簿中擷取ID為3的記錄 ABRecordRef rec = ABAddressBookGetPersonWithRecordID(ab, 3); BOOL result = ABAddressBookRemoveRecord(ab, rec, NULL); if(result){ // 將程式所做的修改儲存到地址簿中,如果儲存成功if(ABAddressBookSave(ab, NULL)) { [self showAlert:@”成功刪除ID為3的連絡人”];}else{ [self showAlert:@”儲存修改時出現的錯誤”];}}else{ [self showAlert:@”刪除失敗”];}} });}}- (void) showAlert:(NSString*)msg{ // 使用UIAlertView顯示msg資訊 [[[UIAlertView alloc] initWithTitle:@”提示” message:msg delegate:nil cancelButtonTitle:@”確定” otherButtonTitles:nil] show];} |