一, 什么是Content Provider?
>内容提供者 Android四大主件之一 :短信记录 通讯录 联系人 自定义
>Content Provider 所有程序间数据的存储和检索的桥梁 把各个程序里的数据共享
各个程序间 数据共享的唯一途径 (Android 没有提供一块独立的空间 将各个程序的数据共享
只能通过 内容提供者 共享数据)
二, 作用
>将自己程序的私有数据 提供里一套对外的访问接口(增,删,改,查)
是基于Uri向外提供数据访问接口
使用:
Content Provider 提供私有数据
Uri:统一资源标识符 (路径)
ContentResolver:内容解析器
三,URI 统一资源标识符
格式:content://应用程序包名.provider/表名(一般情况)
四, 访问Content Provider 提供的数据
>1,获取CntentResolver对象
>2,通过CntentResolver对象 增删改查
五,联系人的数据库文件的位置
/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
/**
* 联系人的帮助类 做增删改查
* @author sxy
*
*/
public class MyContactsHelper {
// 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";
/**
* 插入数据
* 1,在raw_contacts表中添加一条空的数据 为了得到一个id
* 2,通过id添加相应的数据
*/
public static void insertData(ContentResolver contentResolver,Map<String,Object> map){
//1,在raw_contacts表中添加一条空的数据 为了得到一个id
ContentValues values = new ContentValues();
Uri newUri = contentResolver.insert(Uri.parse(uri_rawcontacts), values);
long id = ContentUris.parseId(newUri);
//2,通过id添加相应的数据
//往data表添加联系人的名称
values.clear();
values.put("raw_contact_id", id);
values.put("mimetype", "vnd.android.cursor.item/name");
values.put("data1", map.get("display_name").toString());
values.put("data2", map.get("display_name").toString());
contentResolver.insert(Uri.parse(uri_contacts_data), values);
//往data表添加联系人的电话
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);
contentResolver.insert(Uri.parse(uri_contacts_data), values);
//往data表添加联系人的邮箱
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);
contentResolver.insert(Uri.parse(uri_contacts_data), values);
}
//查询数据
public static List<Map<String, Object>> queryData(ContentResolver contentResolver){
List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();
//查询联系人id
Cursor contactCursor= contentResolver.query(
Uri.parse(uri_rawcontacts),
new String[]{"_id","display_name"},
null, null, null);
//查询联系人名称 联系人的电话 联系人的邮箱
while(contactCursor.moveToNext()){
Map<String, Object> map = new HashMap<String, Object>();
int contactsId = contactCursor.getInt(contactCursor.getColumnIndex("_id"));
String displayName = contactCursor.getString(contactCursor.getColumnIndex("display_name"));
//将联系人的id和联系人的名字存起来了
map.put("_id", contactsId);
map.put("display_name", displayName);
//获取电话号
Cursor phoneCursor = contentResolver.query(Uri.parse(uri_contacts_phones),
new String[]{"raw_contact_id","data1"},
"raw_contact_id = ?",
new String[]{contactsId+""}, null);
//如果一个人有多个电话号 存在当前List
List<String> phoneList = new ArrayList<String>();
//获取联系人电话号 电话号可能有多个
while(phoneCursor.moveToNext()){
String phoneNum = phoneCursor.getString(phoneCursor.getColumnIndex("data1"));
phoneList.add(phoneNum);
}
//存放电话号码(可能多个)
map.put("phones", 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[]{contactsId+""},
null);
//如果有多个邮箱 存在集合中
List<String> emailList = new ArrayList<String>();
while(emailCursor.moveToNext()){
String email = emailCursor.getString(emailCursor.getColumnIndex("data1"));
emailList.add(email);
}
map.put("emails", emailList);
if(emailCursor!=null){
emailCursor.close();
}
list.add(map);
}
if(contactCursor!=null){
contactCursor.close();
}
return list;
}
}
//MainActivity
public class MainActivity extends Activity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
queryContacts();
}
public void MyClick(View v) {
switch (v.getId()) {
case R.id.btn_insert:// 添加数据
Map<String, Object> map = new HashMap<String, Object>();
map.put("display_name", "liyifei");
map.put("phone", "110");
map.put("email", "110@qq.com");
MyContactsHelper.insertData(getContentResolver(), map);
break;
case R.id.btn_delete:// 删除数据
boolean bl = MyContactsHelper.deleteData(getContentResolver(),
"liyifei");
if (bl) {
Toast.makeText(MainActivity.this, "删除符合条件的数据成功", 0).show();
} else {
Toast.makeText(MainActivity.this, "删除符合条件的数据失败", 0).show();
}
break;
case R.id.btn_update:// 修改数据
Map<String, Object> map1 = new HashMap<String, Object>();
map1.put("display_name", "zhangsan");
map1.put("phone", "10086");
map1.put("email", "10086@qq.com");
boolean flag = MyContactsHelper.updateData(getContentResolver(),
13, map1);
if (flag) {
Toast.makeText(MainActivity.this, "修改数据成功", 0).show();
} else {
Toast.makeText(MainActivity.this, "修改数据失败", 0).show();
}
break;
default:
break;
}
// 查询数据
queryContacts();
}
public void queryContacts() {
tv.setText("");
// 获取联系人的数据
List<Map<String, Object>> list = MyContactsHelper
.queryData(getContentResolver());
// 获取联系人的所有内容
for (int i = 0; i < list.size(); i++) {
Map<String, Object> map = list.get(i);
// 展示联系人名称
String displayName = (String) map.get("display_name");
tv.append(displayName + "\n");
// 展示电话号
List<String> phonelist = (List<String>) map.get("phones");
for (int j = 0; j < phonelist.size(); j++) {
tv.append(phonelist.get(j) + "\n");
}
// 展示电话号
List<String> emaillist = (List<String>) map.get("emails");
for (int j = 0; j < emaillist.size(); j++) {
tv.append(emaillist.get(j) + "\n");
}
tv.append("\n");
}
}
}