iPhone通訊錄聯系人的增加、刪除、修改的操作


(轉 http://blog.csdn.net/lichengliang82421/article/details/6863705
(個人說明:刪除和添加聯系人是本人在真機上測試過的。支持一下!!!)

(另:需要操作聯系人群組的朋友,可以參考iPhone 添加刪除聯系人組)
1.需要引入AddressBook.framework框架
2.iPhone通訊錄的增加聯系人的操作,代碼如下(放到項目中可直接運行):

// 初始化一個ABAddressBookRef對象,使用完之后需要進行釋放,
// 這里使用CFRelease進行釋放
// 相當於通訊錄的一個引用
ABAddressBookRef addressBook = ABAddressBookCreate();
// 新建一個聯系人
// ABRecordRef是一個屬性的集合,相當於通訊錄中聯系人的對象
// 聯系人對象的屬性分為兩種:
// 只擁有唯一值的屬性和多值的屬性。
// 唯一值的屬性包括:姓氏、名字、生日等。
// 多值的屬性包括:電話號碼、郵箱等。
ABRecordRef person = ABPersonCreate();
NSString *firstName = @"";
NSString *lastName = @"";
NSDate *birthday = [NSDate date];
// 電話號碼數組
NSArray *phones = [NSArray arrayWithObjects:@"123",@"456", nil];
// 電話號碼對應的名稱
NSArray *labels = [NSArray arrayWithObjects:@"iphone",@"home", nil];
// 保存到聯系人對象中,每個屬性都對應一個宏,例如:kABPersonFirstNameProperty
// 設置firstName屬性
ABRecordSetValue(person, kABPersonFirstNameProperty, (CFStringRef)firstName, NULL);
// 設置lastName屬性
ABRecordSetValue(person, kABPersonLastNameProperty, (CFStringRef) lastName, NULL);
// 設置birthday屬性
ABRecordSetValue(person, kABPersonBirthdayProperty, (CFDateRef)birthday, NULL);
// ABMultiValueRef類似是Objective-C中的NSMutableDictionary
ABMultiValueRef mv = ABMultiValueCreateMutable(kABMultiStringPropertyType);
// 添加電話號碼與其對應的名稱內容
for (int i = 0; i < [phones count]; i ++) {
ABMultiValueIdentifier mi = ABMultiValueAddValueAndLabel(mv, (CFStringRef)[phones objectAtIndex:i], (CFStringRef)[labels objectAtIndex:i], &mi);
}
// 設置phone屬性
ABRecordSetValue(person, kABPersonPhoneProperty, mv, NULL);
// 釋放該數組
if (mv) {
CFRelease(mv);
}
// 將新建的聯系人添加到通訊錄中
ABAddressBookAddRecord(addressBook, person, NULL);
// 保存通訊錄數據
ABAddressBookSave(addressBook, NULL);
// 釋放通訊錄對象的引用
if (addressBook) {
CFRelease(addressBook);
}

(添加,以上只有單一屬性的添加,但是碰見如地址這樣的屬性,該怎樣添加呢,請看下面!)

ABAddressBookRef iPhoneAddressBook = ABAddressBookCreate();        

    ABRecordRef newPerson = ABPersonCreate();

    CFErrorRef error = NULL; 

//address

    ABMutableMultiValueRef multiAddress = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType);        

    NSMutableDictionary *addressDictionary = [[NSMutableDictionary alloc] init];        
//Street
    [addressDictionary setObject:@"750 North Orleans Street, Ste 601" forKey:(NSString *) kABPersonAddressStreetKey];
//City
    [addressDictionary setObject:@"Chicago" forKey:(NSString *)kABPersonAddressCityKey];
//State
    [addressDictionary setObject:@"IL" forKey:(NSString *)kABPersonAddressStateKey];
//Zip
    [addressDictionary setObject:@"60654" forKey:(NSString *)kABPersonAddressZIPKey];        
//label
    ABMultiValueAddValueAndLabel(multiAddress, addressDictionary, kABWorkLabel, NULL);

    ABRecordSetValue(newPerson, kABPersonAddressProperty, multiAddress,&error);

    CFRelease(multiAddress);     

是不是很簡單!
------------------------------------------------------------------------------------------------
3.刪除聯系人的操作,代碼如下(放到項目中可直接運行):

 1 // 初始化並創建通訊錄對象,記得釋放內存
 2 ABAddressBookRef addressBook = ABAddressBookCreate();
 3 // 獲取通訊錄中所有的聯系人
 4 NSArray *array = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
 5 // 遍歷所有的聯系人並刪除(這里只刪除姓名為張三的)
 6 for (id obj in array) {
 7 ABRecordRef people = (ABRecordRef)obj;
 8 NSString *firstName = (NSString *)ABRecordCopyValue(people, kABPersonFirstNameProperty);
 9 NSString *lastName = (NSString *)ABRecordCopyValue(people, kABPersonLastNameProperty);
10 if ([firstName isEqualToString:@""] && [lastName isEqualToString:@""]) {
11 ABAddressBookRemoveRecord(addressBook, people, NULL);
12 }
13 }
14 // 保存修改的通訊錄對象
15 ABAddressBookSave(addressBook, NULL);
16 // 釋放通訊錄對象的內存
17 if (addressBook) {
18 CFRelease(addressBook);
19 }

----------------------------------------------------------------------------------------------
4.修改聯系人的操作,代碼如下(由於項目中使用到了修改聯系人的操作,所以將方法直接復制過來了):
// 根據姓氏、名字以及手機號碼修改聯系人的昵稱和生日

 1 + (void) updateAddressBookPersonWithFirstName:(NSString *)firstName
 2 lastName:(NSString *)lastName
 3 mobile:(NSString *)mobile
 4 nickname:(NSString *)nickname
 5 birthday:(NSDate *)birthday {
 6 
 7 // 初始化並創建通訊錄對象,記得釋放內存
 8 ABAddressBookRef addressBook = ABAddressBookCreate();
 9 // 獲取通訊錄中所有的聯系人
10 NSArray *array = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
11 // 遍歷所有的聯系人並修改指定的聯系人
12 for (id obj in array) {
13 ABRecordRef people = (ABRecordRef)obj;
14 NSString *fn = (NSString *)ABRecordCopyValue(people, kABPersonFirstNameProperty);
15 NSString *ln = (NSString *)ABRecordCopyValue(people, kABPersonLastNameProperty);
16 ABMultiValueRef mv = ABRecordCopyValue(people, kABPersonPhoneProperty);
17 NSArray *phones = (NSArray *)ABMultiValueCopyArrayOfAllValues(mv);
18 // firstName同時為空或者firstName相等
19 BOOL ff = ([fn length] == 0 && [firstName length] == 0) || ([fn isEqualToString:firstName]);
20 // lastName同時為空或者lastName相等
21 BOOL lf = ([ln length] == 0 && [lastName length] == 0) || ([ln isEqualToString:lastName]);
22 // 由於獲得到的電話號碼不符合標准,所以要先將其格式化再比較是否存在
23 BOOL is = NO;
24 for (NSString *p in phones) {
25 // 紅色代碼處,我添加了一個類別(給NSString擴展了一個方法),該類別的這個方法主要是用於將電話號碼中的"("、")"、" "、"-"過濾掉
26 if ([[p iPhoneStandardFormat] isEqualToString:mobile]) {
27 is = YES;
28 break;
29 }
30 }
31 // firstName、lastName、mobile 同時存在進行修改
32 if (ff && lf && is) {
33 if ([nickname length] > 0) {
34 ABRecordSetValue(people, kABPersonNicknameProperty, (CFStringRef)nickname, NULL);
35 }
36 if (birthday != nil) {
37 ABRecordSetValue(people, kABPersonBirthdayProperty, (CFDataRef)birthday, NULL);
38 }
39 }
40 
41 }
42 // 保存修改的通訊錄對象
43 ABAddressBookSave(addressBook, NULL);
44 // 釋放通訊錄對象的內存
45 if (addressBook) {
46 CFRelease(addressBook);
47 }
48 
49 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM