iOS8通讯录之联系人增删查,多号码增删操作
#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通讯录之联系人增删查,多号码增删操作的更多相关文章
- day03 Python字典dict的增删查改及常用操作
字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据.python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必须是可 ...
- day02 Python列表的增删查改及常用操作
列表是python中的基础数据类型之一,其他语言中也有类似于列表的数据类型,比如js中叫数组,他是以[]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型比如: li = [‘alex’,12 ...
- nodejs连接mysql并进行简单的增删查改
最近在入门nodejs,正好学习到了如何使用nodejs进行数据库的连接,觉得比较重要,便写一下随笔,简单地记录一下 使用在安装好node之后,我们可以使用npm命令,在项目的根目录,安装nodejs ...
- Python对MySQL进行增删查改
python连接MySQL数据库:pymysql # 测试操作 import pymysql # 打开数据库 db = pymysql.connect("localhost", & ...
- SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)
SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)-DML 1.SQL INSERT INTO 语句(在表中插入) INSERT INTO 语句用于向表中插入新记录. SQL I ...
- iOS 获得通讯录中联系人的所有属性--b
ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef results = ABAddressBookCopyArrayOfA ...
- 学习记录——使用PHP实现数据增删查改等基本功能(前后端分离)
萌新初次学习服务器端语言,分享学习经验 实现功能:1.显示数据表 2.对数据进行分页 3.对数据进行增删查改 由于本萌新采用前后端完全分离方案,所以数据传输用的ajax,为了提高代码的复用 ...
- 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
- 3.EF 6.0 Code-First实现增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-entity-framework-5-0-code- ...
随机推荐
- JDE FORM开发--checkBox
checkBox设置时,必须指定DD.
- row_number()函数
row_number()over( partition by a order by b desc ) rn 根据[字段a]分组,分组内根据[字段b]排序,次函数返回的是每组内部排序后的序列号(分组内唯 ...
- Java:Collection List Set
Java:集合 常见集合:List Set List 特点:元素是有序的,而且元素可以重复,因为该集合体系有索引. 常见的三个子类:ArrayList.LinkedList.Verctor List集 ...
- POJ 3041 Asteroids 匈牙利算法,最大流解法,行列为点 难度:1
http://poj.org/problem?id=3041 #include <cstdio> #include <cstring> #include <vector& ...
- CAN基础知识
CAN:Controller Area Network,是ISO国际标准化的串行通信协议. CAN控制器根据两根线上的电位来判断总线电平.总线电平分为显性电平和隐性电平,二者必居其一.发送方通过使总线 ...
- 二模 (15)day2
第一题:Alice和Bob两个人正在玩一个游戏,游戏有很多种任务,难度为p的任务(p是正整数),有1/2p 的概率完成并得到2p−1分,如果完成不了,得0分.一开始每人都是0分,从Alice开始轮流做 ...
- IT公司100题-25-求字符串中的最长数字串
问题描述: 实现一个函数,求出字符串中的连续最长数字串.例如输入”12345cbf3456″,输出”12345″. 函数原型为: void conti_num_max( const char * sr ...
- 002 C#学前入门
2016-01-16 1..Net平台 .Net FrameWork框架.Net FrameWork框架提供了一个稳定的运行环境,:来保障我们.Net平台正常的运转 2.C#语言 c sharp编程 ...
- bcopy函数
函数原型:void bcopy(const void *src, void *dest, int n) 头文件:#include <string.h> 函数功能:将src指针指 ...
- Ubuntu user switch
To list all users you can use: cut -d: -f1 /etc/passwd To add a new user you can use: sudo adduser n ...