首先,我们需要知道的两个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. 烂泥:mysql5.5数据库cmake源码编译安装

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 以前也写过一篇有关mysql5.0源码编译的文章,该文章为<烂泥:mysql5.0数据库源码编译安装>.但是MySQL自5.5版本以后,就开 ...

  2. Java调优

    Java调优经验谈 对于调优这个事情来说,一般就是三个过程: 性能监控:问题没有发生,你并不知道你需要调优什么?此时需要一些系统.应用的监控工具来发现问题. 性能分析:问题已经发生,但是你并不知道问题 ...

  3. 设置输入域(input/textarea)中文本光标的位置

    以前记录了一篇 将光标定位于输入框最右侧的实现方式 ,实现光标定位在文本的最末.这种需求往往在修改现有的文本.有时可能还需要把光标定位在首位,或者中间某个位置,这就需要实现一个更通用的方法. 这个方法 ...

  4. @Value取不到值引出的spring的2种配置文件applicationContext.xml和xxx-servlet.xml

    项目中经常会用到配置文件,定义成properties的形式比较常见,为了方便使用一般在spring配置文件中做如下配置: <context:property-placeholder ignore ...

  5. 中午游泳很海皮-linux&php

    hi 中午又去游泳了,其实本来打算是昨天去的,谁知天公不作美,周一都下雨.今天其实也一样的,有点小雨,不过游得到泳,比什么都好 1.PHP&MySQL -----PHP内置MySQL函数学习( ...

  6. 清除浮动clear/BFC

    浮动的清除有两种方式: 一.clear clear:both/left/right; 二.创建BFC (1)什么是BFC? BFC,块级格式化上下文,是一个独立的渲染区域,只有Block-level ...

  7. 空间复杂度是什么?What does ‘Space Complexity’ mean? ------geeksforgeeks 翻译

    这一章比较短! 空间复杂度(space complexity)和辅助空间(auxiliary space)经常混用,下面是正确的辅助空间和空间复杂度的定义 辅助空间:算法需要用到的额外或者暂时的存储空 ...

  8. codeforces 732

    A. Buy a Shovel time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  9. jmeter的压力测试

    Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试. 以下为压力测试的简单介绍 1.在测试计划下增加一个线程组 2.线程组的内容需要进行编辑,根据压力测 ...

  10. JavaScript Math 对象

    JavaScript Math 对象 Math 对象 Math 对象用于执行数学任务. Math 对象并不像 Date 和 String 那样是对象的类,因此没有构造函数 Math(). 语法 var ...