首先,我们需要知道的两个Uri:

1、Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");//查到data表中raw_contact_id

2、Uri uri1 = Uri.parse("content://com.android.contacts/data");

想取数据库里面的信息,就必须要知道表的结构我们看一下view_data表:

我们只需要关心下面三列数据:

从表中我们可以看出,Google将联系人信息放在了一列中,也就是data1列,根据raw_contact_id来区分是否为同一个人的信息,根据mimetype区分联系人信息中的name、phone、email,所以首先我们要获得的是raw_contact_id,但是view_data表中的raw_contact_id是重复的。

下面我们再来看一张表raw_contacts:

从这张表中,我们可以获得联系人的raw_contact_id,也就可以获得联系人的个数,然后通过raw_contact_id获取每个联系人。

表的结构了解了,下面我们来看代码:

     public void readContacts(){
         String name = null;
         String phone= null;
         String eMail= null;
         Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
         Uri uri1 = Uri.parse("content://com.android.contacts/data");
         Cursor cursor = getContentResolver().query(uri,new String[]{"contact_id"},null,null,null);
         while (cursor.moveToNext()){
             String contacts_id = cursor.getString(0);
             //System.out.println("contact_id :"+contacts_id);

             if (contacts_id!=null){
                 /**
                  * projection  第二个参数,要查询的列,为null则是查询所有的列
                  * selection    第三个参数,根据什么条件查询
                  * selectionArgs    第四个参数,根据什么查的参数
                  *
                  */
                 Cursor cursor1 = getContentResolver().query(uri1,new String[]{"data1","mimetype"},"raw_contact_id=?",new String[]{contacts_id},null);
                 while (cursor1.moveToNext()){
                     String data1 = cursor1.getString(0);
                     String mimetype = cursor1.getString(1);
                     //System.out.println("data1:"+data1+"--"+"mimetype:"+mimetype);
                     if (mimetype.equals("vnd.android.cursor.item/name")){
                         name = data1;
                     }else if (mimetype.equals("vnd.android.cursor.item/phone_v2")){
                         phone = data1;
                     }else if (mimetype.equals("vnd.android.cursor.item/email_v2")){
                         eMail = data1;
                     }

                 }
                 System.out.println("name:"+name+"- phone:"+phone+" -email:"+eMail);
             }
         }
     }

记得加权限:

<uses-permission android:name="android.permission.READ_CONTACTS"/>

从代码中,我们可以看的很清楚,先获取raw_contact_id,然后通过他,获取data1和mimetype,然后通过mimetype知道data1中的数据是name、phone或者email。

ps:其实解析data表就是解析view_data

下面是插入联系人:
看代码:
    public void insertContacts(){
        Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
        Uri uri1 = Uri.parse("content://com.android.contacts/data");
        Cursor cursor = getContentResolver().query(uri,null,null,null,null);
        int count = cursor.getCount();
        int count_id = count+1;

        ContentValues values = new ContentValues();
        values.put("contact_id",count_id);
        getContentResolver().insert(uri,values);
        ContentValues contactValue = new ContentValues();

        contactValue.put("data1","张三");
        contactValue.put("raw_contact_id",count_id);
        contactValue.put("mimetype","vnd.android.cursor.item/name");
        getContentResolver().insert(uri1,contactValue);
        contactValue.clear();//插完之后记得clear

        contactValue.put("data1","133333333");
        contactValue.put("raw_contact_id",count_id);
        contactValue.put("mimetype","vnd.android.cursor.item/phone_v2");
        getContentResolver().insert(uri1,contactValue);
        contactValue.clear();

        contactValue.put("data1","478569@qq.com");
        contactValue.put("raw_contact_id",count_id);
        contactValue.put("mimetype","vnd.android.cursor.item/email_v2");
        getContentResolver().insert(uri1,contactValue);
        contactValue.clear();
    }

基本思路,先从raw_contact表中获取当前联系人的个数,然后在加上1之后插入联系人,



getContentResolver()内容解析者查询联系人、插入联系人的更多相关文章

  1. android102 查询,插入联系人

    package com.itheima.getcontacts; import com.itheima.getcontacts.domain.Contact; import android.net.U ...

  2. Android 之内容提供者 内容解析者 内容观察者

    contentProvider:ContentProvider在Android中的作用是对外提供数据,除了可以为所在应用提供数据外,还可以共享数据给其他应用,这是Android中解决应用之间数据共享的 ...

  3. JDBC连接(MySql)数据库步骤,以及查询、插入、删除、更新等十一个处理数据库信息的功能

    主要内容:  JDBC连接数据库步骤. 一个简单详细的查询数据的例子. 封装连接数据库,释放数据库连接方法. 实现查询,插入,删除,更新等十一个处理数据库信息的功能.(包括事务处理,批量更新等) 把十 ...

  4. IdentityServer4源码解析_5_查询用户信息接口

    协议简析 UserInfo接口是OAuth2.0中规定的需要认证访问的接口,可以返回认证用户的声明信息.请求UserInfo接口需要使用通行令牌.响应报文通常是json数据格式,包含了一组claim键 ...

  5. gradle相关配置内容解析

    gradle 项目的构建工具,基于groovy语言.主要用于管理依赖包. as中一般将gradle下载在C:\Documents and Settings<用户名>.gradle\wrap ...

  6. 使用PDO连接数据库 查询和插入乱码的解决方法

    问题:PDO连接数据库后,查询和插入中文到数据库,出现乱码,如图: 解决方法: 法1: try{ $opts_values = array(PDO::MYSQL_ATTR_INIT_COMMAND=& ...

  7. 把一个select查询结果插入到一个表(可选指定字段和值实例)

    把一个select查询结果插入到一个表(可选指定字段和值实例) insert into  bak (cc,yf) select cc,9 from ket insert into bak (cc,yf ...

  8. 写了一个Windows API Viewer,提供VBA语句的导出功能。提供两万多个API的MSDN链接内容的本地查询

    始出处:http://www.cnblogs.com/Charltsing/p/APIViewer.html QQ:564955427,QQ群:550672198 世面上的API Viewer已经不少 ...

  9. Oracle Blob查询和插入

    注:本文来源于<Oracle Blob查询和插入> 插入 UPDATE cmm05 SET OUTFILE = to_blob('12345690'): 查询: SELECT utl_ra ...

随机推荐

  1. C语言(函数)学习之strstr strcasestr

    C语言(函数)学习之[strstr]&[strcasestr]一.strstr函数使用[1]函数原型char*strstr(constchar*haystack,constchar*needl ...

  2. linux mysql 常用

    mysql -uroot -p输入密码进入 use database;使用指定的数据库 show tables;显示存在的表:describe 表名; source 目标文件.sql; 可以执行指定的 ...

  3. android中BuildConfig.DEBUG的使用

    ADT(r17)中添加了一个新功能可以允许开发者只在Debug模式下允许某些代码.Build系统生成一个名称为BuildConfig的类,该类包含一个DEBUG 常量,该常量会根据您的Build类型自 ...

  4. Windows批处理:自动检查服务器连通性

    该技术与上一篇<自动检查网络连通性>的实现原理相同,我将脚本稍微改动了下,用于检查公司服务器的连通性,简单快捷.在这里附上修改方法. @echo off color 1F title 服务 ...

  5. 使用redis进行消息推送

    Redis支持这样一种特性,你可以将数据推到某个信息管道中,然后其它客户端可以通过订阅这些管道来获取推送过来的信息.使用Redis的Pub/Sub,接收方在某个channel注册为一个订阅者,然后监听 ...

  6. AngularJS服务

    在使用AngularJS的路由管理和控制视图加载的时候,当新的视图加载进来,原有视图的控制器会被销毁,这是出于内存占用和性能的考虑.服务提供了一种能在应用的整个生命周期内保持和共享数据的方法,它能够在 ...

  7. mapred-site.xml 配置在线更新

    环境:ibm jdk , cdh2.35.0.2 需求:更新mapred-site.xml 中的mapreduce.map.java.opts 和 mapreduce.reduce.java.opts ...

  8. HTTP常见状态码 200 301 302 404 500

    HTTP状态码(HTTP Status Code) 一些常见的状态码为: 一.1开头 1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码.代码 说明 100 (继续) 请求者应当继续提出 ...

  9. jquery实现输入框聚焦,键盘上下键选择城市

    在最近有个项目中 需要实现当文本框聚焦的时候,可以键盘上下键选择内容,按enter键的时候,把内容传到输入框中,如图所示: 实现代码如下: /** *输入框聚焦,键盘上下键选择城市 */ ;(func ...

  10. cookie 和 session 的基础知识

    cookie 和 session 的基础知识 cookie 和session 的区别详解 这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会 ...