Content Provider

Content Provider
一, 什么是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");
}


}


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值