首页 > 系统 > Android > 正文

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

2019-11-09 17:41:48
字体:
来源:转载
供稿:网友

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); }
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表