ContentProvider内容提供者
ContentProvider(内容提供者)是用来共享应用程序内的数据;
当我们需要把应用程序的数据共享给其他的应用程序的时候用它;
该组件对外提供了其他应用可以直接访问的增删改查方法;
只要通过ContentProvider暴露了自己的数据,不管是否启动了应用程序,都可以访问到。
ContentProvider原理
简单来说,ContentProvider暴露数据的过程,类似于网站的访问。
例如:Servlet只是一个接口,提供了访问数据库的功能,但是并不对外提供完整的操作页面。如果需要操作这个接口的话,就必须要有一个客户端通过一个URI来访问
当成Android内部的网站,地址是URI
浏览网页时的URI
http://www.google.com.hk/intl/zh-CN/images/logo_cn.png
http是固定的,指定进行什么协议
红色部分,网站域名部分,网站总是跟域名绑定
最后就是网站资源部分内容提供者的URI
URI代表要操作的数据,由scheme、authorites、path三个部分组成
content://cn.verydu.wq.providers.bookprovider/book/2
scheme:固定位content,代表访问内容提供者
authrites:中间的共色部分就是ContentProvider的归属,通过这部分找到对应的ContentProvider(节点中的authorites属性)
path:资源路径,可根据业务逻辑自定义
向URI发送请求,这种请求最后委托给ContentProvider处理
- 注册ContentProvider时,需要为它绑定一个URI
发送请求必须要由一个客户端发出,这个客户端就是ContentResolver
- 相当于访问网页时的浏览器
创建ContentProvider
首先自定义一个类继承ContentProvider,并根据需要重写内部的方法
public class MyPersonProvider extends ContentProvider {
@Override
public boolean onCreate() {
Log.i("test","onCreate");
return false;
}
@Nullable
@Override
public Cursor query(Uri uri, String[] strings, String s, String[] strings1, String s1) {
Log.i("test","query");
return null;
}
@Nullable
@Override
public String getType(Uri uri) {
Log.i("test","getType");
return null;
}
@Nullable
@Override
public Uri insert(Uri uri, ContentValues contentValues) {
Log.i("test","insert");
return null;
}
@Override
public int delete(Uri uri, String s, String[] strings) {
Log.i("test","delete");
return 0;
}
@Override
public int update(Uri uri, ContentValues contentValues, String s, String[] strings) {
Log.i("test","update");
return 0;
}
}
在清单文件的节点下进行配置,标签中需要制定那么和authorities
<!--配置内容提供者-->
<provider
android:authorities="com.example.android_24_contentprovider.PERSONS"
android:name=".com.zking.provider.MyPersonProvider"
android:exported="true"
></provider>
访问ContentProvider
新建一个Module,通过Context的getContentResolver()方法获得ContentResolver对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取内容访问者
cr = getContentResolver();
}
再调用ContentResolver对象的方法就可以访问内容提供者了(我下面做的是一个简单的查询所有)
//查询所有
public void getData(View view){
//协议 (地址,类似http:///www.baidu.com)前缀是content://
Uri uri = Uri.parse("content://com.example.android_24_contentprovider.PERSONS");
//访问数据
cr.query(uri,null,null,null,null);
}