1.系统联系人的数据库(3张最重要的表)

(1)raw_contacts  联系人表

       保存联系人的id   contact_id

(2)data 数据表

      保存联系人的数据

(3)mimetypes

      MIME数据类型表

  

2.因为如果要访问ContentProvider,必须要了解URI的设置(authority,path等);只有查看源代码才能够知道;AndroidManifest.xml为清单文件,列出了ContactProvider的authorities,以及要访问通讯录需要的权限;

3.通讯录数据库结构介绍:

表结构如下:

通讯录是存放在/data/data/com.android.providers.contacts/databases/contacts2.db,里面主要的表有:

(1)raw_contacts:存放联系人的ID,

_id属性为主键,声明为autoincrement,即不需要手动设置,其他属性也不需要手动设置就有默认值;

display_name属性为姓名;

(2)mimetypes:存放数据的类型,比如"vnd.android.cursor.item/name"表示“姓名”类型的数据,"vnd.android.cursor.item/phone_v2"表示“电话”类型的数据;

(3)data:存放具体的数据;

raw_contact_id属性用来连接raw_contacts表,每条记录表示一个具体数据;我们主要的数据(email、phone等)都存放在data表;

data1属性存放总数据;

data2属性:

-如果此记录存放姓名,则data2存放名;

-如果此记录存放电话,则data2存放类型,比如手机、家电;

-如果此记录存放组织,则data2存放类型,比如公司、其他;

-如果此记录存放地址,则data2存放类型,比如住宅,单位等;

4. 编程提示:

URI

对raw_contacts表添加、删除、更新操作:

URI =  content://com.android.contacts/raw_contacts;

对data表添加、删除、更新操作:
URI =  content://com.android.contacts/data;
 
根据email对data表查询:

URI =     content://com.android.contacts/data/emails/filter/*

 

根据电话号码对data表查询

URI =     content://com.android.contacts/data/phone/filter/*

 

如果要根据ID查询电话,可以
URI = content://com.android.contacts/data;
然后where条件为:raw_contact_id=? and mimetype = ?
 

 

 

MIMETYPE
 
电话:vnd.android.cursor.item/phone_v2
姓名:vnd.android.cursor.item/name
邮件:vnd.android.cursor.item/email_v2
通信地址:vnd.android.cursor.item/postal-address_v2
组织:vnd.android.cursor.item/organization
照片:vnd.android.cursor.item/photo



Data中的常量

Data._ID: "_id"

Data.DISPLAY_NAME:“display_name”

Data.DATA1:“data1”

Data.DATA2:“data2”

Data.RAW_CONTACT_ID:“raw_contact_id”

Data.MIMETYPE:“mimetype”

5.思考? 如何获取联系人的数据。

(1) 查询raw_contacts  获取所有的联系人的id ;

(2)  根据id查询data表,获取当前联系人的数据 ;

 

6.下面通过一个案例说明如何获取联系人信息

(1)activity_main.xml文件,如下:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.himi.readcontacts.MainActivity" > <Button
android:onClick="click"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="读取联系人数据" /> </RelativeLayout>

布局效果,如下:

(2)MainActivity.java,如下:

 package com.himi.readcontacts;

 import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} /**
*
* 读取联系人数据库,获取联系人信息
*/
public void click(View view) {
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
Uri datauri = Uri.parse("content://com.android.contacts/data");
//1.查询raw_contacts表格,获取用户id
Cursor cursor = resolver.query(uri, new String[]{"contact_id"}, null, null, null);
while(cursor.moveToNext()) {
String id =cursor.getString(0);
System.out.println(id);
//2.根据id查询data表,把这个联系人的数据获取出来
Cursor dataCursor = resolver.query(datauri, new String[]{"data1","mimetype"}, "raw_contact_id=?",
new String[]{id}, null);
while(dataCursor.moveToNext()) {
String data1 = dataCursor.getString(0);
String mimetype = dataCursor.getString(1);
System.out.println("data:"+data1);
System.out.println("mimetype:"+mimetype);
}
dataCursor.close(); }
cursor.close();
} }

当然上面观察源码,可以获取访问的权限,如下:

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

添加到AndroidMainfest.xml文件之中。

(3)布署到模拟器上,运行如下:

点击" 读取联系人数据",观察logcat打印的日志:

09-15 00:49:13.538: I/System.out(744): id1
09-15 01:17:25.688: I/System.out(841): 1
09-15 01:17:26.018: I/System.out(841): data:221112@163.com
09-15 01:17:26.018: I/System.out(841): mimetype:vnd.android.cursor.item/email_v2
09-15 01:17:26.018: I/System.out(841): data:34555555555
09-15 01:17:26.028: I/System.out(841): mimetype:vnd.android.cursor.item/phone_v2
09-15 01:17:26.028: I/System.out(841): data:Yjg
09-15 01:17:26.028: I/System.out(841): mimetype:vnd.android.cursor.item/name
09-15 01:17:26.048: I/System.out(841): 2
09-15 01:17:26.108: I/System.out(841): data:22222222@163.com
09-15 01:17:26.108: I/System.out(841): mimetype:vnd.android.cursor.item/email_v2
09-15 01:17:26.108: I/System.out(841): data:355-5555
09-15 01:17:26.108: I/System.out(841): mimetype:vnd.android.cursor.item/phone_v2
09-15 01:17:26.118: I/System.out(841): data:Yty
09-15 01:17:26.118: I/System.out(841): mimetype:vnd.android.cursor.item/name

打印的日志表明,已经获取了联系人的信息,下面是通信录中保存的联系人,如下:

Android(java)学习笔记249:ContentProvider使用之获得系统联系人信息01的更多相关文章

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

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

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

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

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

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

  4. android学习笔记54——ContentProvider

    ContentProvider ContentProvider用于实现数据共享. ContentProvider是不同应用程序之间进行数据交换的标准API,其以某种Uri的形式对外提供数据,允许其他应 ...

  5. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  6. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  7. Android动画学习笔记-Android Animation

    Android动画学习笔记-Android Animation   3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...

  8. Java学习笔记:语言基础

    Java学习笔记:语言基础 2014-1-31   最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...

  9. Android 数字签名学习笔记

    Android 数字签名学习笔记 在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个permission的pro ...

随机推荐

  1. inputtype

    <EditText android:layout_width="fill_parent" android:layout_height="wrap_content&q ...

  2. 【USACO 1.1.4】破碎的项链

    [题目描述] 你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的.这里是 n=29 的二个例子:                 1 2      ...

  3. 08_linux下安装chrome

    首先下载chrome,需要改hosts哦(o(^▽^)o,别告诉我你不会,可以问度娘.谷哥哦) 下载地址:https://dl.google.com/linux/direct/google-chrom ...

  4. js删除选中的复选框中的父辈。

    function scsx(){ var cb=document.getElementsByName('checkbox') if(confirm('删除?')){ for (var i=0;i< ...

  5. ASP.NET程序从IIS6移植到IIS7时出现500.22错误

    最可能的原因:  •    此应用程序在 system.web/httpModules 节中定义配置.  可尝试的操作:  •    将配置迁移到 system.webServer/modules 节 ...

  6. jquery easy ui 学习 (1)Basic Window

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. DNS递归和迭代原理

    11.3.7 DNS递归解析原理 “递归解析”(或叫“递归查询”,其实意思是一样的)是最常见,也是默认的解析方式.在这种解析方式中,如果客户端配置的本地名称服务器不能解析的话,则后面的查询全由本地名称 ...

  8. GitHub 入门

    1. CentOS 安装 Github. # sudo yum install skynet 安装之后查看一下版本. # git --version 2. 注册 Github 账号,登录后阅读 Git ...

  9. 转:Google论文之二----Google文件系统(GFS)翻译学习

    文章来自于:http://www.cnblogs.com/geekma/archive/2013/06/09/3128372.html 摘要 我们设计并实现了Google文件系统,它是一个可扩展的分布 ...

  10. 启动weblogic11g一直提示<141281> <unable to get file lock, will retry ...>

    一次非正常关闭weblogic之后,再次启动时启动不成功,一直提示:<141281> <unable to get file lock, will retry ...> 解决方 ...