您的位置:首页 > 数据库 > SQL

Android四大组件之一ContentProvider内容提供者(继SQLite数据存储篇)

2017-02-07 17:11 911 查看

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android