#import <AddressBook/AddressBook.h>

#pragma mark 删除一个号码
- (void)deleteLocalMarkSuccess:(void(^)(BOOL success))successBlock{ dispatch_async(dispatch_get_global_queue(, ), ^{
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef records;
// 获取通讯录中全部联系人
records = ABAddressBookCopyArrayOfAllPeople(addressBook); // 遍历全部联系人,检查已存号码库信息数量
for (int i=; i<CFArrayGetCount(records); i++)
{
ABRecordRef record = CFArrayGetValueAtIndex(records, i); CFTypeRef phones = ABRecordCopyValue(record, kABPersonPhoneProperty);
// CFArrayRef values = ABMultiValueCopyArrayOfAllValues(phones);
// NSArray *arr =(__bridge NSArray *)(values);
// if (!arr.count) {
// continue;
// }
NSString *firstphoneNumber = (CFBridgingRelease(ABMultiValueCopyValueAtIndex(phones,)));
NSString *firstLabel = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(phones,));
NSLog(@"firstPhone = %@ firstLabel = %@",firstphoneNumber,firstLabel);
CFStringRef firstNameRef = ABRecordCopyValue(record, kABPersonFirstNameProperty);
//这里是特殊情况的比较号码并删除,正常是比较姓名即可
if ([firstLabel isEqualToString:@"#0云助手号码库yunzhushou"])
{
bool done = ABAddressBookRemoveRecord(addressBook, record, nil);
successBlock(done);
break;
}
} ABAddressBookSave(addressBook, nil);
CFRelease(addressBook);
}); }
#pragma mark 删除一个号码属性

- (void)deletePersonPropertyWithNumber:(NSString *)phoneNumber withBlock:(void(^)(BOOL success))successBlock{

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
dispatch_async(dispatch_get_global_queue(, ), ^{
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef records;
// 获取通讯录中全部联系人
records = ABAddressBookCopyArrayOfAllPeople(addressBook);
__block bool done = NO;
// 遍历全部联系人,检查是否存在指定号码再进行删除
for (int i=; i<CFArrayGetCount(records); i++)
{
ABRecordRef record = CFArrayGetValueAtIndex(records, i);
CFTypeRef phones = ABRecordCopyValue(record, kABPersonPhoneProperty);
NSString *firstLabel = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(phones,));
CFArrayRef phoneNums = ABMultiValueCopyArrayOfAllValues(phones); if ([firstLabel isEqualToString:@"#0云助手号码库yunzhushou"])
{
for (int j=; j<CFArrayGetCount(phoneNums); j++)
{
NSString *phone = (NSString*)CFArrayGetValueAtIndex(phoneNums, j);
if ([phone isEqualToString:phoneNumber])
{
ABMutableMultiValueRef multiPhone = ABMultiValueCreateMutableCopy(phones);
done = ABMultiValueRemoveValueAndLabelAtIndex(multiPhone,j);
ABRecordSetValue(record, kABPersonPhoneProperty, multiPhone, nil);
CFRelease(multiPhone); break;
}else{
NSLog(@"没有找到要删除的号码:%@",phoneNumber);
}
}
}else
{
NSLog(@"没有找到要删除的联系人:%@",phoneNumber); }
} successBlock(done);
ABAddressBookSave(addressBook, nil);
CFRelease(addressBook); }); }); }
#pragma mark 增加一个号码属性
- (void)addPersonPropertyWithNumberModel:(NumberModel *)numberModel withBlock:(void(^)(BOOL success))successBlock{ dispatch_async(dispatch_get_global_queue(, ), ^{
__block bool done = NO;
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef records;
// 获取通讯录中全部联系人
records = ABAddressBookCopyArrayOfAllPeople(addressBook); // 遍历全部联系人,检查是否存在指定号码再进行add
bool have = NO;
for (int i=; i<CFArrayGetCount(records); i++)
{
ABRecordRef record = CFArrayGetValueAtIndex(records, i);
CFTypeRef phones = ABRecordCopyValue(record, kABPersonPhoneProperty);
NSString *firstLabel = CFBridgingRelease(ABMultiValueCopyLabelAtIndex(phones,));
NSLog(@"firstLabel = %@",firstLabel);
CFStringRef firstNameRef = ABRecordCopyValue(record, kABPersonFirstNameProperty);
CFStringRef lastName = ABRecordCopyValue(record, kABPersonLastNameProperty);
//此处正常应该根据名字判断 下面是特殊情况根据首个号码标签属性来判断
if ([firstLabel isEqualToString:@"#0云助手号码库yunzhushou"])
{
have = YES;
BOOL containNumber = NO;
//存在 本地联系人只要添加一对标签号码属性
//已存在则不添加
CFArrayRef phoneNumbers = ABMultiValueCopyArrayOfAllValues(phones);
for (int j ; j < CFArrayGetCount(phoneNumbers); j++) {
NSString *number = (__bridge NSString *)CFArrayGetValueAtIndex(phoneNumbers, j);
if ([number isEqualToString:numberModel.phone]) {
containNumber = YES;
break;
}
}
if (!containNumber) {
ABMutableMultiValueRef multiPhone = ABMultiValueCreateMutableCopy(phones); ABMultiValueAddValueAndLabel(multiPhone, (__bridge CFTypeRef)(numberModel.phone), (__bridge CFStringRef)(numberModel.rpt_type), NULL);
ABRecordSetValue(record, kABPersonPhoneProperty, multiPhone, nil);
CFRelease(multiPhone);
done = ABAddressBookSave(addressBook, nil); NSLog(@"本地标记联系人存在 只是添加属性");
break ; } } } if (!have) {
//不存在 首次添加
NSLog(@"本地标记联系人不存在 首次添加");
// [self wirteLocalPhoneNumbersToContactFromDB];
done = YES;
} ABAddressBookSave(addressBook, nil);
CFRelease(addressBook);
successBlock(done);
}); }
//iOS9 组织多号码以备写入新的联系人
- (void)numbersReadyWriteToContact{ CNMutableContact *mContact = [[CNMutableContact alloc]init];
mContact.imageData = UIImagePNGRepresentation([UIImage
imageNamed:@""]);
mContact.givenName = @"";
mContact.familyName = @"";
NSString *label = @"住宅";
NSString *number = -;
NSMutableArray *arrPhones =[NSMutableArray array];
CNLabeledValue *phone = [CNLabeledValue labeledValueWithLabel:label value:[CNPhoneNumber phoneNumberWithStringValue:number]];
[arrPhones addObject:phone];
mContact.phoneNumbers = arrPhones;
[self stroreContact: contact];
}
//iOS9 存入新联系人 -多值
- (void)stroreContact:(CNMutableContact *)contact
{
BOOL existPhone = NO;
if (contact.phoneNumbers.count>) {
CNLabeledValue *firstLabelValue = contact.phoneNumbers[];
CNPhoneNumber *firstPhoneNumber = firstLabelValue.value;
existPhone = [self existPhone:firstPhoneNumber.stringValue];
} if (existPhone) {
NSLog(@"号码已存在");
return;
}
NSLog(@"号码不存在,存储新的联系人"); //创建添加请求
CNSaveRequest *saveRequest = [[CNSaveRequest alloc]init];
[saveRequest addContact:contact toContainerWithIdentifier:nil];
//写入
CNContactStore *store = [[CNContactStore alloc]init];
[store executeSaveRequest:saveRequest error:nil];
}
//phoneList 为包含多对号码属性字典的数组,用于一个为一个联系人添加多个号码
- (void)addNewContact:(NSArray *)phonesList
{
BOOL existPhone = NO;
if (phonesList.count>) {
NSString *firstPhoneNumber = phonesList[][@"value"];
existPhone = [self existPhone:firstPhoneNumber];
} if (existPhone) {
NSLog(@"号码已存在");
return;
}
NSLog(@"号码不存在,存储新的联系人"); //name
ABAddressBookRef iPhoneAddressBook = ABAddressBookCreate();
CFErrorRef error = NULL;
ABRecordRef newPerson = ABPersonCreate();
ABRecordSetValue(newPerson, kABPersonFirstNameProperty, @"", &error);
ABRecordSetValue(newPerson, kABPersonLastNameProperty, @"", &error); ABMutableMultiValueRef multiPhone = ABMultiValueCreateMutable(kABMultiStringPropertyType); for (NSInteger i = ; i < phonesList.count; i++) {
ABMultiValueAddValueAndLabel(multiPhone, (__bridge CFTypeRef)(phonesList[i][@"value"]), (__bridge CFStringRef)(phonesList[i][@"label"]), NULL);
ABRecordSetValue(newPerson, kABPersonPhoneProperty, multiPhone, nil);
NSLog(@"%ld",i);
} ABAddressBookAddRecord(iPhoneAddressBook, newPerson, &error);
ABAddressBookSave(iPhoneAddressBook, &error); CFRelease(multiPhone);
CFRelease(newPerson);
CFRelease(iPhoneAddressBook); }

// 指定号码是否已经存在
- (BOOL)existPhone:(NSString*)phoneNum{
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef records;
// 获取通讯录中全部联系人
records = ABAddressBookCopyArrayOfAllPeople(addressBook); // 遍历全部联系人,检查是否存在指定号码
for (int i=; i<CFArrayGetCount(records); i++)
{
ABRecordRef record = CFArrayGetValueAtIndex(records, i);
CFTypeRef phones = ABRecordCopyValue(record, kABPersonPhoneProperty);
CFArrayRef phoneNums = ABMultiValueCopyArrayOfAllValues(phones);
if (phoneNums)
{
for (int j=; j<CFArrayGetCount(phoneNums); j++)
{
NSString *phone = (NSString*)CFArrayGetValueAtIndex(phoneNums, j);
if ([phone isEqualToString:phoneNum])
{
return YES;
}
}
}
}
CFRelease(addressBook);
return NO;
}

iOS8通讯录之联系人增删查,多号码增删操作的更多相关文章

  1. day03 Python字典dict的增删查改及常用操作

    字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据.python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必须是可 ...

  2. day02 Python列表的增删查改及常用操作

    列表是python中的基础数据类型之一,其他语言中也有类似于列表的数据类型,比如js中叫数组,他是以[]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型比如: li = [‘alex’,12 ...

  3. nodejs连接mysql并进行简单的增删查改

    最近在入门nodejs,正好学习到了如何使用nodejs进行数据库的连接,觉得比较重要,便写一下随笔,简单地记录一下 使用在安装好node之后,我们可以使用npm命令,在项目的根目录,安装nodejs ...

  4. Python对MySQL进行增删查改

    python连接MySQL数据库:pymysql # 测试操作 import pymysql # 打开数据库 db = pymysql.connect("localhost", & ...

  5. SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)

    SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)-DML 1.SQL INSERT INTO 语句(在表中插入) INSERT INTO 语句用于向表中插入新记录. SQL I ...

  6. iOS 获得通讯录中联系人的所有属性--b

    ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef results = ABAddressBookCopyArrayOfA ...

  7. 学习记录——使用PHP实现数据增删查改等基本功能(前后端分离)

    萌新初次学习服务器端语言,分享学习经验 实现功能:1.显示数据表    2.对数据进行分页    3.对数据进行增删查改 由于本萌新采用前后端完全分离方案,所以数据传输用的ajax,为了提高代码的复用 ...

  8. 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  9. 3.EF 6.0 Code-First实现增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-entity-framework-5-0-code- ...

随机推荐

  1. guava学习--集合1

    Lists: 其内部使用了静态工厂方法代替构造器,提供了许多用于List子类构造和操作的静态方法,我们简单的依次进行说明,如下: newArrayList():构造一个可变的.空的ArrayList实 ...

  2. nginx rewrite 指令last break区别最详细的解释

    转自:http://blog.sina.com.cn/s/blog_4f9fc6e10102ux0w.html http://blog.cafeneko.info/2010/10/nginx_rewr ...

  3. JAVA OOP 基础知识提纲

    OOP: 面向对象: 认识事物的一个过程,是整体(特征/行为) 认识事物的方式.人类认识事物的自然思维习惯. 对象及类 对象是实实在在具体存在的东西,主要是从两个角度(行为,特征)去观察 类:是一组具 ...

  4. WCF初探-16:WCF数据协定之基础知识

    数据协定概念 “数据协定”是在服务与客户端之间达成的正式协议,用于以抽象方式描述要交换的数据. 也就是说,为了进行通信,客户端和服务不必共享相同的类型,而只需共享相同的数据协定. 数据协定为每一个做数 ...

  5. OC语言description方法和sel

    OC语言description方法和sel 一.description方法 Description方法包括类方法和对象方法.(NSObject类所包含) (一)基本知识 -description(对象 ...

  6. javaee包含的服务和组件

    参考自 http://blog.itpub.net/29990276/viewspace-1318551/

  7. hadoop运行原理之Job运行(二) Job提交及初始化

    本篇主要介绍Job从客户端提交到JobTracker及其被初始化的过程. 以WordCount为例,以前的程序都是通过JobClient.runJob()方法来提交Job,但是现在大多用Job.wai ...

  8. Python开发入门与实战6-表单

    6. 表单 从简朴的单个搜索框,到常见的Blog评论提交表单,再到复杂的自定义数据输入接口,HTML表单一直是交互性网站的重要交互手段.本章介绍如何用Django如何对用户通过表单提交的数据进行访问. ...

  9. JavaScript基础--DOM对象(十三):(windows对象:history\location\navigator\screen\event)

    DOM编程1.为什么要学习DOM(1) 通过dom编程,我们可以写出各种网页游戏(2)dom编程也是ajax的重要基础2.DOM编程介绍DOM = Document Object Model(文档对象 ...

  10. HBase with MapReduce (Summary)

    我们知道,hbase没有像关系型的数据库拥有强大的查询功能和统计功能,本文实现了如何利用mapreduce来统计hbase中单元值出现的个数,并将结果携带目标的表中, (1)mapper的实现 pac ...