1.重要:

系统删除一个联系人,默认情况下并不是把这个联系人直接删除掉了,只是做了一个标记,标记为被删除。

2.前面一讲说过了如何获取系统联系人信息(通过ContentProvider),获取联系人信息是经常使用,下面封装成工具类,方便以后调用:

下面通过案例说明一下:

(1)Android工程如下图:

(2)其中工具类ContactInfoUtils.java,如下:

 package com.himi.readcontacts.utils;

 import java.util.ArrayList;
import java.util.List; import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract.Data; import com.himi.readcontacts.domain.ContactInfo; /**
* 联系人信息的工具类
* @author Administrator
*
*/
public class ContactsInfoUtils { /**
* 根据电话号码查询姓名
* @param context 上下文
* @return 返回
*/
public static String getContactByPhone(Context context,String phone)throws Exception{
//uri= content://com.android.contacts/data/phones/filter/#
Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/"+phone);
ContentResolver resolver = context.getContentResolver();
Cursor cursor = resolver.query(uri, new String[]{Data.DISPLAY_NAME}, null, null, null); //从raw_contact表中返回display_name
if(cursor.moveToFirst()){
System.out.println("name="+cursor.getString(0));
}
String result = cursor.getString(0);
return result;
} /**
* 查询所有联系人信息
* @param context 上下文
* @return
*/
public static List<ContactInfo> getAllContactInfos(Context context) {
List<ContactInfo> infos = new ArrayList<ContactInfo>();
ContentResolver resolver = context.getContentResolver();
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
Uri datauri = Uri.parse("content://com.android.contacts/data");
Cursor cursor = resolver.query(uri, new String[] { "contact_id" },
null, null, null);
while (cursor.moveToNext()) {
String id = cursor.getString(0);
ContactInfo info = new ContactInfo();
info.setId(id); System.out.println("id"+id);
if (id != null) {
// 根据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);
if (data1 != null && mimetype != null) {
if ("vnd.android.cursor.item/email_v2".equals(mimetype)) {// email
info.setEmail(data1);
} else if ("vnd.android.cursor.item/im"
.equals(mimetype)) {// QQ
info.setQQ(data1);
} else if ("vnd.android.cursor.item/name"
.equals(mimetype)) {// name
info.setName(data1);
} else if ("vnd.android.cursor.item/phone_v2"
.equals(mimetype)) {// phone
info.setPhone(data1);
}
}
}
infos.add(info);
dataCursor.close();
}
}
cursor.close();
return infos;
} /**
* 添加一个联系人
* @param context 上下文
* @param phone 添加联系人的电话
* @param name 添加联系人的姓名
* @param email 添加联系人的email
*/
public static void AddContact(Context context, String phone, String name, String email)throws Exception {
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
Uri datauri = Uri.parse("content://com.android.contacts/data");
ContentResolver resolver = context.getContentResolver();
//1.在raw_contace表里面添加一条新的id _id desc:表示按照id降序排列
Cursor cursor = resolver.query(uri, new String[]{"_id"}, null, null, "_id desc");
cursor.moveToFirst();
int _id = cursor.getInt(0);//之前,降序排列,这里获得表中最大id值
//计算出来新添加的条目的id
int newId = _id+1;
ContentValues values = new ContentValues();
values.put("contact_id", newId);
resolver.insert(uri, values); //2.在data表中添加对应的数据
//添加电话号码phone
ContentValues phoneValue = new ContentValues();
phoneValue.put("raw_contact_id", newId);
phoneValue.put("mimetype", "vnd.android.cursor.item/phone_v2");
phoneValue.put("data1", phone);
resolver.insert(datauri, phoneValue);
//添加姓名
ContentValues nameValue = new ContentValues();
nameValue.put("raw_contact_id", newId);
nameValue.put("mimetype", "vnd.android.cursor.item/name");
nameValue.put("data1", name);
resolver.insert(datauri, nameValue);
//添加email
ContentValues emailValue = new ContentValues();
emailValue.put("raw_contact_id", newId);
emailValue.put("mimetype", "vnd.android.cursor.item/email_v2");
emailValue.put("data1", email);
resolver.insert(datauri, emailValue); } /**
* 删除一个联系人
*
* 核心思想:
* (1)先在raw_contacts表根据姓名(此处的姓名为name记录的data2的数据而不是data1的数据)查出id;
* (2)在data表中只要raw_contact_id匹配的都删除;
* @param context 上下文
* @param name 删除用户的姓名
*/
public static boolean DeleteContact(Context context,String name)throws Exception{
boolean status = false;
//根据姓名求id
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
ContentResolver resolver = context.getContentResolver();
Cursor cursor = resolver.query(uri, new String[]{Data._ID},"display_name=?", new String[]{name}, null);
if(cursor.moveToFirst()){
int id = cursor.getInt(0);
//根据id删除data中的相应数据
resolver.delete(uri, "display_name=?", new String[]{name});
uri = Uri.parse("content://com.android.contacts/data");
//根据id清空raw_contact_id
resolver.delete(uri, "raw_contact_id=?", new String[]{id+""});
status = true;
}
return status;
} /**
* 更新联系人
* 核心思想:
* (1)不需要更新raw_contacts,只需要更新data表;
* (2)uri=content://com.android.contacts/data 表示对data表进行操作;
* @param context
* @throws Exception
*/
public static void UpdateContact(Context context) throws Exception{
int id = 1;
String phone = "999999";
Uri uri = Uri.parse("content://com.android.contacts/data");//对data表的所有数据操作
ContentResolver resolver = context.getContentResolver();
ContentValues values = new ContentValues();
values.put("data1", phone);
resolver.update(uri, values, "mimetype=? and raw_contact_id=?", new String[]{"vnd.android.cursor.item/phone_v2",id+""}) ;
} }

用户domain信息类ContactInfo.java,如下:

 package com.himi.readcontacts.domain;

 /**
*
* 联系人的业务bean
*
*/
public class ContactInfo {
private String id;
private String name;
private String email;
private String phone;
private String qq;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getQQ() {
return qq;
}
public void setQQ(String qq) {
this.qq = qq;
}
@Override
public String toString() {//方便System.out.println()打印日志
return "ContactInfo [id=" + id + ", name=" + name + ", email=" + email
+ ", phone=" + phone + ", qq=" + qq + "]";
} }

读取ContentProvider之联系人信息,需要添加权限(查看源码可以获知),如下:

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.himi.readcontacts"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>

(3)回到MainActivity.java,如下:

 package com.himi.readcontacts;

 import java.util.List;

 import android.app.Activity;
import android.os.Bundle;
import android.view.View; import com.himi.readcontacts.domain.ContactInfo;
import com.himi.readcontacts.utils.ContactsInfoUtils; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} /**
*
* 读取联系人数据库,获取联系人信息
*/
public void click(View view) {
List<ContactInfo> infos = ContactsInfoUtils.getAllContactInfos(this);
for(ContactInfo info:infos) {
System.out.println(info.toString());
} } }

(4)布署到模拟器上,运行的效果如下:

观察logcat打印的日志,如下:

09-15 01:36:12.498: I/System.out(911): id1
09-15 01:36:12.549: I/System.out(911): id2
09-15 01:36:12.867: I/System.out(911): ContactInfo [id=1, name=Yjg, email=221112@163.com, phone=34555555555, qq=null]
09-15 01:36:12.867: I/System.out(911): ContactInfo [id=2, name=Yty, email=22222222@163.com, phone=355-5555, qq=null]

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

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

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

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

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

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

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

  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. 20145330第六周《Java学习笔记》

    20145330第六周<Java学习笔记> . 这周算是很忙碌的一周.因为第六周陆续很多实验都开始进行,开始要准备和预习的科目日渐增多,对Java分配的时间不知不觉就减少了,然而第十和十一 ...

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

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

随机推荐

  1. hibernate_validator_03

    约束继承 如果要验证的对象继承于某个父类或者实现了某个接口,那么定义在父类或者接口中的约束会在验证这个对象的时候被自动加载,如同这些约束定义在这个对象所在的类中一样. 让我们来看看下面的示例: pac ...

  2. C语言笔记(数组地址一些细节)

     一.数组的a+1和&a+1的区别 先看看测试代码: ]={}; printf(" sizeof(data) = %d.\n", sizeof(data)); printf ...

  3. soket客户端程序(一)

    soket客户端主要完成以下步骤: 1.建立soket套接字(将套接字理解为一个通道) 2.建立连接 3.向服务器发送http请求 4.接收得到的数据 5.关闭连接 6.本地处理得到的数据 http: ...

  4. 习题二:string数组应用

    说明: 读字符串char buf[100]="xxx:yyy:zzz:aaa:bbb" 按“:”进行分解到string数组中去 逻辑: 通过指针遍历整个字符串 遇到'\0'表示字符 ...

  5. android.os.NetworkOnMainThreadException 在4.0之后谷歌强制要求连接网络不能在主线程进行访问

    谷歌在4.0系统以后就禁止在主线程中进行网络访问了,原因是: 主线程是负责UI的响应,如果在主线程进行网络访问,超过5秒的话就会引发强制关闭, 所以这种耗时的操作不能放在主线程里.放在子线程里,而子线 ...

  6. An unspecified error occurred!

    在我们生成证书的时候,有时候会遇到这个问题,明明刚从电脑的钥匙串申请的证书,却报错!遇到这个不用急.多试几次.不是你的生成的证书不管用,多半原因是因为你的网速太挫了!

  7. 转:etc/fstab 文件详解

    etc/fstab这个文件的所有参数,这个文件是非常重要的.这个文件是配置文件系统的体系,创建的所有分区,都必须写在这个文件里面,否则下次启动的时候你的分区是挂不起来的.首先学习一个mount –a ...

  8. poj 2406Power Strings

    http://poj.org/problem?id=2406 #include<cstdio> #include<cstring> #include<algorithm& ...

  9. Android ContentProvider 简介

    当在系统中部署一个又一个Android应用之后,系统里将会包含多个Android应用,有时候就需要在小同的应用之问芡亭数据,比如现在有一个短信接收应用,用户想把接收到的陌生短信的发信人添加到联系人管理 ...

  10. linux mount / umount 命令的基本用法

    linux mount / umount 命令的基本用法 及 开机自动挂载 格式:mount [-参数] [设备名称] [挂载点] 其中常用的参数有: -a 安装在/etc/fstab文件中类出的所有 ...