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

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四大组)