ContentProvider和ContentResolver是两个非常重要的概念。
如果是ContentProvider是内容提供者的话,那么ContentResolver就是内容提取者,它负责从ContentProvider中提取或处理数据。
ContentResolver通过uri告诉ContentProvider需要获取或处理哪些数据。如果要实现ContentProvider那么需要继承ContentProvider并重写其中的抽象方法:
|
方 法 名 称 |
方 法 描 述 |
|
insert(Uri,ContentValues) |
插入 |
|
delete(Uri,String,String[]) |
删除 |
|
update(Uri,ContentValues,String,String[]) |
修改 |
|
query(Uri,String[],String,String[],Stting) |
查询 |
|
getType(Uri) |
获得MIME数据类型 |
|
onCreate() |
当ContentProvider创建时调用 |
|
getContext() |
获得Context对象 |
•我们是在ContentProvider中实现我们实际操作数据的方法的。但是,客户端调用时,我们用到了另外的一个接口,它就是ContenResolver。ContentResolver中提供和ContentProvider中对应的方法。我们是间接地通过操作ContentResolver来操作ContentProvider的。
•ContentResolver通过应用程序的getContentResolver()方法获得。一般情况下,ContentProvider是单实例的,但是可以有多个ContentResolver在不同的应用程序和不同的进程之间和ContentProvider交互。
|
方 法 名 称 |
方 法 描 述 |
|
insert(Uri,ContentValues) |
插入 |
|
delete(Uri,String,String[]) |
删除 |
|
update(Uri,ContentValues,String,String[]) |
修改 |
|
query(Uri,String[],String,String[],Stting) |
查询 |
URL:
•ContentProvider又是如何共享其数据的呢?这里就要知道另外的一个概念,这便是URI。ContentProvider就是通过该对象来共享其数据的。
•一个URI对象必须以“content://”开头,接下来是URI的授权部分,这部分内容要和AndroidManifest.xml配置文件中声明的授权内容一致,后面还可能有数据类型和记录ID。
•通过URI可以使得ContentResolver知道和哪个ContentProvider对应,并且来操作哪些表以及记录。
•ContentResolver操作数据的步骤只需两步:
–1.调用Activity的getContentResolver()获取ContentResolver对象。
–2.根据需要调用ContentResolver的insert()、delete()、update()、query()方法操作数据。
为了操作系统提供的ContentResolver,只需了解该ContentProvider的Uri即可
example:
管理联系人部分代码:
Android系统提供了Contact应用程序来管理联系人,其中用到的Uri如下:
ContactsContract.Contacts.CONTENT_URI:管理联系人的Uri。
ContactsContract.CommonDataKinds.Phone.CONTENT_URI:管理联系人的电话Uri。
ContactsContract.CommonDataKinds.Email.CONTENT_URI:管理联系人的Email的Uri
//使用ContentResolver查找联系人数据
Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
//获取联系人ID
String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
//获取联系人的姓名
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
//根据联系人的ID查找该联系人下的所有电话
Cursor phoneCursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=?", new String[]{contactId}, null);
while(phoneCursor.moveToNext()){
String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
infoList.add("电话号码:"+phoneNumber);
}
//根据联系人的ID查找该联系人下的所有Email
Cursor emailCursor = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + "=?", new String[]{contactId}, null);
while(emailCursor.moveToNext()){
String email = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
infoList.add("mail:"+email);
}
ContentValues values = new ContentValues();
//向RawContacts插入一个空值,目的为了得到增加联系人的ID
Uri rawContactUri = getContentResolver().insert(RawContacts.CONTENT_URI, values);
//获取Uri中的id
long rawContactId = ContentUris.parseId(rawContactUri);
//增加姓名
values.clear();
//指定此姓名相关联的联系人ID
values.put(Data.RAW_CONTACT_ID, rawContactId);
//设置添加姓名的MIME类型
values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
//设置添加的姓名为该联系人的姓名
values.put(StructuredName.GIVEN_NAME, name);
getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
//增加电话
values.clear();
//指定此电话相关联的联系人ID
values.put(Data.RAW_CONTACT_ID, rawContactId);
//设置添加电话的MIME类型
values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
//设置添加电话属于什么类型(手机、住宅或办公等等)
values.put(Phone.TYPE,Phone.TYPE_MOBILE);
//设置添加的电话为该联系人的电话
values.put(Phone.NUMBER, phone);
getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
//增加email
values.clear();
//指定此email相关联的联系人ID
values.put(Data.RAW_CONTACT_ID, rawContactId);
//设置添加email的MIME类型
values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
//设置添加email属于什么类型(家用或办公等等)
values.put(Email.TYPE,Email.TYPE_WORK);
//设置添加的email为该联系人的email
values.put(Email.DATA, email);
getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
ContactsContract.Contacts.CONTENT_URI:管理联系人的Uri。
ContactsContract.CommonDataKinds.Phone.CONTENT_URI:管理联系人的电话Uri。
ContactsContract.CommonDataKinds.Email.CONTENT_URI:管理联系人的Email的Uri
//使用ContentResolver查找联系人数据
Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
//获取联系人ID
String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
//获取联系人的姓名
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
//根据联系人的ID查找该联系人下的所有电话
Cursor phoneCursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=?", new String[]{contactId}, null);
while(phoneCursor.moveToNext()){
String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
infoList.add("电话号码:"+phoneNumber);
}
//根据联系人的ID查找该联系人下的所有Email
Cursor emailCursor = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + "=?", new String[]{contactId}, null);
while(emailCursor.moveToNext()){
String email = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
infoList.add("mail:"+email);
}
ContentValues values = new ContentValues();
//向RawContacts插入一个空值,目的为了得到增加联系人的ID
Uri rawContactUri = getContentResolver().insert(RawContacts.CONTENT_URI, values);
//获取Uri中的id
long rawContactId = ContentUris.parseId(rawContactUri);
//增加姓名
values.clear();
//指定此姓名相关联的联系人ID
values.put(Data.RAW_CONTACT_ID, rawContactId);
//设置添加姓名的MIME类型
values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
//设置添加的姓名为该联系人的姓名
values.put(StructuredName.GIVEN_NAME, name);
getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
//增加电话
values.clear();
//指定此电话相关联的联系人ID
values.put(Data.RAW_CONTACT_ID, rawContactId);
//设置添加电话的MIME类型
values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
//设置添加电话属于什么类型(手机、住宅或办公等等)
values.put(Phone.TYPE,Phone.TYPE_MOBILE);
//设置添加的电话为该联系人的电话
values.put(Phone.NUMBER, phone);
getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
//增加email
values.clear();
//指定此email相关联的联系人ID
values.put(Data.RAW_CONTACT_ID, rawContactId);
//设置添加email的MIME类型
values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
//设置添加email属于什么类型(家用或办公等等)
values.put(Email.TYPE,Email.TYPE_WORK);
//设置添加的email为该联系人的email
values.put(Email.DATA, email);
getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
本文详细介绍了Android中ContentProvider和ContentResolver的概念及其工作原理。ContentProvider作为内容提供者,负责存储和检索数据;ContentResolver则作为内容提取者,通过URI与ContentProvider交互,进行数据的操作。

被折叠的 条评论
为什么被折叠?



