content provider对联系人的基本操作

来源:互联网 发布:新加坡旅游消费知乎 编辑:程序博客网 时间:2024/05/17 00:53

一, 什么是Content Provider?
>内容提供者 Android四大主件之一 :
可以对短信记录 通讯录 联系人 自定义 等操作

>Content Provider 所有程序间数据的存储和检索的桥梁 把各个程序里的数据共享
各个程序间 数据共享的唯一途径 (Android 没有提供一块独立的空间 将各个程序的数据共享
只能通过 内容提供者 共享数据)
二, 作用
>将自己程序的私有数据 提供里一套对外的访问接口(增,删,改,查)
是基于Uri向外提供数据访问接口
使用:
Content Provider 提供私有数据
Uri:统一资源标识符 (路径)
ContentResolver:内容解析器
三,URI 统一资源标识符
格式:content://应用程序包名.provider/表名(一般情况)
private static String uri_rawcontacts = "content://com.android.contacts/raw_contacts";
private static String uri_contacts_phones="content://com.android.contacts/data/phones";
private static String uri_contacts_emails = "content://com.android.contacts/data/emails";
private static String uri_contacts_data = "content://com.android.contacts/data";

四, 访问Content Provider 提供的数据
>1,获取CntentResolver对象 查询数据
public List<Map<String, Object>> getContact(ContentResolver contentResolver){
List<Map<String, Object>> list=new ArrayList<Map<String,Object>>();
Cursor cursor=contentResolver.query(
Uri.parse(uri_rawcontacts),
new String[]{"_id","display_name"},
null,
null,
null);
while(cursor.moveToNext()){
Map<String, Object> map=new HashMap<String, Object>();
int _id=cursor.getInt(cursor.getColumnIndex("_id"));
String display_name=cursor.getString(cursor.getColumnIndex("display_name"));
//添加联系人姓名
map.put("_id", _id);
map.put("display_name", display_name);
Cursor phoneCursor=contentResolver.query(
Uri.parse(uri_contacts_phones),
new String[]{"raw_contact_id","data1"},
"raw_contact_id = ?",
new String[]{_id+""},
null);
List<String> phoneList=new ArrayList<String>();
while(phoneCursor.moveToNext()){
String phone=phoneCursor.getString(phoneCursor.getColumnIndex("data1"));
phoneList.add(phone);
}
map.put("phoneList", phoneList);
if(phoneCursor!=null){
phoneCursor.close();
}
//添加邮箱
Cursor emailCursor=contentResolver.query(
Uri.parse(uri_contacts_emails),
new String[]{"raw_contact_id","data1"},
"raw_contact_id = ?",
new String[]{_id+""},
null);
List<String> emailList=new ArrayList<String>();
while(emailCursor.moveToNext()){
String email=emailCursor.getString(emailCursor.getColumnIndex("data1"));
emailList.add(email);
}
map.put("emailList", emailList);
if(emailCursor!=null){
emailCursor.close();
}
list.add(map);
}
if(cursor!=null){
cursor.close();
}
return list;
}

>2,通过CntentResolver对象 增删改查
添加数据
public void insertContact(ContentResolver resolver,Map<String, Object> map){
//插入一条空的数据
ContentValues values=new ContentValues();
Uri newUri=resolver.insert(Uri.parse(uri_rawcontacts), values);
long id=ContentUris.parseId(newUri);
values.clear();
values.put("raw_contact_id", id);
//添加姓名
values.put("mimetype", "vnd.android.cursor.item/name");
values.put("data1", map.get("name").toString());
values.put("data2", map.get("name").toString());
resolver.insert(Uri.parse(uri_contacts_data), values);
//添加电话
values.clear();
values.put("raw_contact_id", id);
values.put("mimetype", "vnd.android.cursor.item/phone_v2");
values.put("data1", map.get("phone").toString());
values.put("data2", 2);
resolver.insert(Uri.parse(uri_contacts_data), values);
//添加邮箱
values.clear();
values.put("raw_contact_id", id);
values.put("mimetype", "vnd.android.cursor.item/email_v2");
values.put("data1", map.get("email").toString());
values.put("data2",1);
resolver.insert(Uri.parse(uri_contacts_data), values);
}
删除数据
public boolean deleteContact(ContentResolver contentResolver,String name){
int num=contentResolver.delete(Uri.parse(uri_rawcontacts),
"display_name=?",
new String[]{name});
if(num>0){
return true;
}
return false;
}


修改数据
public static boolean updateData(ContentResolver contentResolver,int id,Map<String, Object> map){
ContentValues values = new ContentValues();
//将raw_contacts表中名字修改
values.put("display_name", map.get("display_name").toString());
values.put("display_name_alt", map.get("display_name").toString());
values.put("sort_key", map.get("display_name").toString());
values.put("sort_key_alt", map.get("display_name").toString());
int num = contentResolver.update(Uri.parse(uri_rawcontacts), values, "_id = ?", new String[]{id+""});
//修改data表中 姓名
values.clear();
values.put("data1", map.get("display_name").toString());
values.put("data2", map.get("display_name").toString());
int num2 = contentResolver.update(Uri.parse(uri_contacts_data),
values, "raw_contact_id =? and mimetype_id = ? ", new String[]{id+"","7"});
//修改data电话号
values.clear();
values.put("data1", map.get("phone").toString());
values.put("data2", 2);
int num3 = contentResolver.update(Uri.parse(uri_contacts_data),
values, "raw_contact_id =? and mimetype_id = ? ", new String[]{id+"","5"});
//修改data邮箱
values.clear();
values.put("data1", map.get("email").toString());
values.put("data2", 1);
int num4 = contentResolver.update(Uri.parse(uri_contacts_data),
values, "raw_contact_id =? and mimetype_id = ? ", new String[]{id+"","1"});
if(num>0&&num2>0&&num3>0&&num4>0){
return true;
}
return false;
}



五,联系人的数据库文件的位置
/data/data/com.android.providers.contacts/databases.contacts2.db
六,数据库中重要的几张表
主要包含三张表,contacts,raw_contacts,data

contacts表:contacts表中一条记录对应联系人列表中的一个联系人
(通过可能包含多个联系人的信息),此表不可直接插入联系人。
它是raw_contacts表记录的整合

raw_contacts表:未经处理的联系人,当插入一个联系人时,
系统会检测当前表中是否有存在相同号码、姓名的联系人,
根据用户设置是否聚合,将可以整合的记录指向同一个contact_id

data表:data表中的记录仅仅保存的是某一种类型的数据,
里面有一个地段mimetype_id,
用来关联mimetype表中的类型
,一个raw_contact一般会对应多条data记录


Uri:
// ContentResolver是通过uri来获取数据的,
// 电话号有电话号的uri
// 邮箱有邮箱的uri
// data有data的uri
// 这一系列uri是contentprovider自己定义的,我们只是调用
private static String uri_rawcontacts = "content://com.android.contacts/raw_contacts";
private static String uri_contacts_phones="content://com.android.contacts/data/phones";
private static String uri_contacts_emails = "content://com.android.contacts/data/emails";
private static String uri_contacts_data = "content://com.android.contacts/data";

类型:
vnd.android.cursor.item/name 名称
vnd.android.cursor.item/phone_v2 电话
vnd.android.cursor.item/email_v2 邮箱

0 0