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);