1.联系人的查找

返回一个ArrayList<HashMap<String,  String>>类型

//通过管理联系人的URI获取游标对象
Cursor cursor= getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
ArrayList<HashMap<String, String>> contactData = new ArrayList<HashMap<String, String>>();
while (cursor.moveToNext()) {
String contactId=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
String contactName=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)).trim();
String contactPhone=null;
//通过管理联系人电话的URI获取游标对象
Cursor cursorForPhone=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+contactId, null, null);
if(cursorForPhone.moveToFirst()){
contactPhone=cursorForPhone.getString(cursorForPhone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)).replaceAll(" ", "");
}
cursorForPhone.close();
//删除无效联系人
if(contactPhone==null){
int id=getContentResolver().delete(ContactsContract.RawContacts.CONTENT_URI, ContactsContract.Contacts._ID+"="+contactId, null);
Toast.makeText(contactList.this,"无效联系人"+contactName+"已清空"+id, Toast.LENGTH_SHORT).show();
continue;
}
HashMap<String, String> contact=new HashMap<String, String>();
contact.put("uid", contactId);
contact.put("name", contactName);
contact.put("phone", contactPhone); contactData.add(contact);
}
cursor.close();
return contactData;

 

以上demo也包含了联系人的删除

2.联系人的添加

String contactName=name.getText().toString().trim();
String contactPhone=phone.getText().toString().trim();
ArrayList<ContentProviderOperation> operation=new ArrayList<ContentProviderOperation>();
//在raw_contacts主表中添加一条数据
ContentProviderOperation op1= ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
.withValue("account_id", null)
.build();
operation.add(op1); //在data表中添加一条联系人姓名类型的数据
ContentProviderOperation op2= ContentProviderOperation.newInsert(Data.CONTENT_URI)
.withValueBackReference(Data.RAW_CONTACT_ID, 0)
.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
.withValue(StructuredName.GIVEN_NAME, contactName)
.build();
operation.add(op2);
//在data表中添加一条电话类型的数据
ContentProviderOperation op3= ContentProviderOperation.newInsert(Data.CONTENT_URI)
.withValueBackReference(Data.RAW_CONTACT_ID, 0)
.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
.withValue(Phone.NUMBER, contactPhone)
.withValue(Phone.TYPE, Phone.TYPE_MOBILE)
.build();
operation.add(op3); try{
//执行上面的操作,该方法会开启事务
getContentResolver().applyBatch("com.android.contacts", operation);
Toast.makeText(AddContact.this, "添加成功!", Toast.LENGTH_SHORT).show();
} catch (RemoteException | OperationApplicationException e) {
e.printStackTrace();
}

对于联系人的操作,其实是对于data/data/com.android.providers.contacts/databases/contacts2.db的操作

主要需要了解的几张表:contacts,raw_contacts,data,mimetype,对于通话记录的操作,则需要该文件下的calls等表操作。

涉及到的URI:

Contacts.CONTENT_URI

  对应contacts表,主要是联系人的主要信息

    以上的图只截取了部分内容

Data.CONTENT_URI

对应data表中的数据

 

    上图中可以看出有些phone数据类型错误,成了name类型,这也是之前电话号码不显示的原因

CommonDataKinds.Phone.CONTENT_URI

  对应的是data表中,类型为电话号码的数据

 

CommonDataKinds.Email.CONTENT_URI

  对应的是data表中,类型为电话号码的数据

 

RawContacts.CONTENT_URI

  对应raw_contacts表中的数据

这个只是android中ContentProvider的一个应用,还有许多应用也通过ContentProvider共享了它们的数据

contentProvider-联系人的CURD的更多相关文章

  1. ContentProvider中央档案馆,以及获取联系人电话的示例

    Android官方文档介绍的数据存储方式共有五种,sqlite,SharedPreferences,网络存储,外储存储,文件存储,但是这些数据都无法进行共享,那么我们就引入了今天的主角:Content ...

  2. Android(java)学习笔记251:ContentProvider使用之添加数据到联系人(掌握)

    1.添加联系人逻辑思路 (1)首先在raw_contacts创建一个新的id (2)在data表里面添加这个id对应的数据 2.下面通过一个案例,说明一下如何添加一条数据到联系人: (1)首先我们关注 ...

  3. Android(java)学习笔记250:ContentProvider使用之获得系统联系人信息02(掌握)

    1.重要: 系统删除一个联系人,默认情况下并不是把这个联系人直接删除掉了,只是做了一个标记,标记为被删除. 2.前面一讲说过了如何获取系统联系人信息(通过ContentProvider),获取联系人信 ...

  4. Android(java)学习笔记249:ContentProvider使用之获得系统联系人信息01

    1.系统联系人的数据库(3张最重要的表) (1)raw_contacts  联系人表        保存联系人的id   contact_id (2)data 数据表       保存联系人的数据 ( ...

  5. 用ContentProvider获取通讯录联系人

    手机中的联系人数据实际是保存在数据库中的,但Android并没有让我们通过操作数据库去读取数据,而是通过一个ContractProvider这个应用提供了一个ContentProvider访问接口. ...

  6. android菜鸟学习笔记23----ContentProvider(三)利用内置ContentProvider监听短信及查看联系人

    要使用一个ContentProvider,必须要知道的是它所能匹配的Uri及其数据存储的表的结构. 首先想办法找到访问短信及联系人数据的ContentProvider能接受的Uri: 到github上 ...

  7. Android(java)学习笔记195:ContentProvider使用之添加数据到联系人(掌握)

    1.添加联系人逻辑思路 (1)首先在raw_contacts创建一个新的id (2)在data表里面添加这个id对应的数据 2.下面通过一个案例,说明一下如何添加一条数据到联系人: (1)首先我们关注 ...

  8. Android(java)学习笔记194:ContentProvider使用之获得系统联系人信息02(掌握)

    1.重要: 系统删除一个联系人,默认情况下并不是把这个联系人直接删除掉了,只是做了一个标记,标记为被删除. 2.前面一讲说过了如何获取系统联系人信息(通过ContentProvider),获取联系人信 ...

  9. Android(java)学习笔记193:ContentProvider使用之获得系统联系人信息01

    1.系统联系人的数据库(3张最重要的表) (1)raw_contacts  联系人表        保存联系人的id   contact_id (2)data 数据表       保存联系人的数据 ( ...

  10. Android 开发 ContentProvider 获取歌曲列表和联系人的样例

    ContentProvider(内容提供者)是Android中的四大组件之中的一个. 主要用于对外共享数据.也就是通过ContentProvider把应用中的数据共享给其它应用訪问.其它应用能够通过C ...

随机推荐

  1. Unity3D之Mecanim动画系统学习笔记(六):使用脚本控制动画

    控制人物动画播放 这里我重新弄了一个简单的场景和新的Animator Controller来作为示例. 下面先看看Animator Controller的配置: 人物在站立状态只能进入走路,走路只能进 ...

  2. 调用DEDE日期时间格式整理大全

    dedecms 日期时间格式大全,大家可以根据需要选择.DEDECMS利用strftime()函数格式化时间的所有参数详解,包括年份日期进制.小时格式等,大家收藏吧,呵. 日期时间格式 (利用strf ...

  3. thttpd的定时器

    运用了static函数实现文件封装 提升变量访问效率的关键字register,该关键字暗示该变量可能被频繁访问,如果可能,请将值存放在寄存器中 内存集中管理,每个节点在取消后并没有立即释放内存,而是调 ...

  4. ie6的兼容问题及解决方案

    1.png24位的图片在ie6浏览器上会出现背景,解决方案是做成png8位: 2.浏览器默认的margin和padding不同,解决方法是用全局重置来统一,即是*{margin:0;padding:0 ...

  5. C#的枚举数(Enumerator)和可枚举类型(Enumerable)

    数组可以被foreach语句遍历数组中的元素,原因是数组可以按需提供一个叫做枚举数(enumerator)的对象.枚举数可以依次返回请求的数组的元素. 对于有枚举数的类型而言,必须有一个方法来获取它们 ...

  6. cocos2d-x的初步学习二十一之iosandroid跨平台环境配置

    这篇文章中,我们将来构建下跨平台开发的环境配置,我自己也是参考了别人了文章,折腾了几个小时,尤其是android的配置相对麻烦些.... 参考自子龙山人:http://www.cnblogs.com/ ...

  7. 【转】2013年中国IT业10大公司

    转自:http://www.chinaz.com/news/2013/1217/331446.shtml?zyy 1.最得志的公司:小米 在2013年,再没有一家公司像小米这样志得意满,即便看看所有的 ...

  8. HDU 4593 H - Robot 水题

    H - RobotTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.act ...

  9. 也谈OpenFlow, SDN, NFV

    Copyright (2014) 郭龙仓. All Rights Reserved. OpenFlow 传统的网络环境中,仅仅有路由器/交换机之间的接口/协议是标准化的,可是在网络设备内部,数据平面和 ...

  10. HDU3572 Task Schedule 【最大流】

    Task Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...