简介
共享型组件,用于其他组件乃至其他应用共享数据,内部需要实现CRUD操作,并且维持了一套数据集合,主要CRUD要处理好对线程同步,因为这些方法是在Binder线程池中被调用的
原理
底层采用Binder机制,
ContentProvider
以表格形式组织数据,具有crud四个方法让外部应用操作其中的数据,Android为常见的数据(如通讯录、日程表等)提供了内置了默认的ContentProvider 但也可根据需求自定义ContentProvider,但下面6个方法必须重写
<-- 4个核心方法 -->
public Uri insert(Uri uri, ContentValues values)
// 外部进程向 ContentProvider 中添加数据
public int delete(Uri uri, String selection, String[] selectionArgs)
// 外部进程 删除 ContentProvider 中的数据
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
// 外部进程更新 ContentProvider 中的数据
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
// 外部应用 获取 ContentProvider 中的数据
// 注:
// 1. 上述4个方法由外部进程回调,并运行在ContentProvider进程的Binder线程池中(不是主线程)
// 2. 存在多线程并发访问,需要实现线程同步
// a. 若ContentProvider的数据存储方式是使用SQLite & 一个,则不需要,因为SQLite内部实现好了线程同步,若是多个SQLite则需要,因为SQL对象之间无法进行线程同步
// b. 若ContentProvider的数据存储方式是内存,则需要自己实现线程同步
<-- 2个其他方法 -->
public boolean onCreate()
// ContentProvider创建后 或 打开系统后其它进程第一次访问该ContentProvider时 由系统进行调用
// 注:运行在ContentProvider进程的主线程,故不能做耗时操作
public String getType(Uri uri)
// 得到数据类型,即返回当前 Url 所代表数据的MIME类型
ContentResolver
ContentProvider类并不会直接与外部进程交互,而是通过ContentResolver 类,该类通过URI 即可操作不同的ContentProvider 中的数据,外部进程通过 ContentResolver类从而与ContentProvider类进行交互,ContentResolver类有对所有的ContentProvider进行统一管理的作用。
// 外部进程向 ContentProvider 中添加数据
public Uri insert(Uri uri, ContentValues values)
// 外部进程 删除 ContentProvider 中的数据
public int delete(Uri uri, String selection, String[] selectionArgs)
// 外部进程更新 ContentProvider 中的数据
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
// 外部应用 获取 ContentProvider 中的数据
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
优点
- 安全:允许开发部分数据
- 高效解耦:ContentProvider类并不会直接与外部进程交互,而是通过ContentResolver 类解耦了 底层数据的存储方式,使得无论底层数据存储采用何种方式,外界对数据的访问方式都是统一的
参考