Android(java)学习笔记193:ContentProvider使用之获得系统联系人信息01
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;
URI = content://com.android.contacts/data/emails/filter/*
根据电话号码对data表查询
URI = content://com.android.contacts/data/phone/filter/*
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)学习笔记193:ContentProvider使用之获得系统联系人信息01的更多相关文章
- Android(java)学习笔记249:ContentProvider使用之获得系统联系人信息01
1.系统联系人的数据库(3张最重要的表) (1)raw_contacts 联系人表 保存联系人的id contact_id (2)data 数据表 保存联系人的数据 ( ...
- Android(java)学习笔记250:ContentProvider使用之获得系统联系人信息02(掌握)
1.重要: 系统删除一个联系人,默认情况下并不是把这个联系人直接删除掉了,只是做了一个标记,标记为被删除. 2.前面一讲说过了如何获取系统联系人信息(通过ContentProvider),获取联系人信 ...
- Android(java)学习笔记194:ContentProvider使用之获得系统联系人信息02(掌握)
1.重要: 系统删除一个联系人,默认情况下并不是把这个联系人直接删除掉了,只是做了一个标记,标记为被删除. 2.前面一讲说过了如何获取系统联系人信息(通过ContentProvider),获取联系人信 ...
- android学习笔记54——ContentProvider
ContentProvider ContentProvider用于实现数据共享. ContentProvider是不同应用程序之间进行数据交换的标准API,其以某种Uri的形式对外提供数据,允许其他应 ...
- 0028 Java学习笔记-面向对象-Lambda表达式
匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- Android动画学习笔记-Android Animation
Android动画学习笔记-Android Animation 3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...
- Java学习笔记:语言基础
Java学习笔记:语言基础 2014-1-31 最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...
- Android 数字签名学习笔记
Android 数字签名学习笔记 在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个permission的pro ...
随机推荐
- 使用linux内核hrtimer高精度定时器实现GPIO口模拟PWM,【原创】
关键词:Android linux hrtimer 蜂鸣器 等待队列 信号量 字符设备 平台信息:内核:linux3.4.39 系统:android/android5.1平台:S5P4418 作 ...
- POJ1417 True Liars —— 并查集 + DP
题目链接:http://poj.org/problem?id=1417 True Liars Time Limit: 1000MS Memory Limit: 10000K Total Submi ...
- YTU 2811: 打鱼还是晒网
2811: 打鱼还是晒网 时间限制: 1 Sec 内存限制: 128 MB 提交: 192 解决: 150 题目描述 中国有句俗话"三天打鱼,两天晒网".小王从2000年的1月 ...
- try-with-resources使用示例
try (InputStream is = new FileInputStream("test")) { is.read(); ... } catch(Exception e) { ...
- JAVA JVM 流程一
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机 ...
- 基于COCHONUT做和弦识别
论文为:COCHONUT: Recognizing Complex Chords From MIDI Guitar Sequences 出处:international symposium/confe ...
- HDU-ACM“菜鸟先飞”冬训系列赛——第8场(1004)
Problem D Time Limit : 3000/3000ms (Java/Other) Memory Limit : 65535/102400K (Java/Other) Problem De ...
- bzoj 1230: [Usaco2008 Nov]lites 开关灯【线段树】
在线段树上记录长度.区间01翻转标记.当前1个数.传递tag的时候用长度-1个数即可 #include<iostream> #include<cstdio> using nam ...
- 浅谈并查集 By cellur925【内含题目食物链、银河英雄传说等】
什么是并查集? 合并!查询!集合! 专业点说? 动态维护若干不重叠的和,支持合并查询的数据结构!(lyd老师说的) 数据结构特点:代表元.即为每个集合选择一个固定的元素,作为整个集合的代表,利用树形结 ...
- 自己动手利用CentOS6.5 搭建php环境安装discuz论坛
1.安装搭建论坛必要的软件 apache php mysql CentOS系统我们可以直接使用 yum install 的方式进行软件安装,腾讯云有提供软件安装源,是同步CentOS官方的安装源,包涵 ...