Content Provider详解(太懒不想抄)
1.Content Provider作用
进程间进行数据交互&共享,即跨进程通信
2.Content Provider原理
content provider底层是采用Android中Binder机制。
2.1统一资源标识符(URI)
- 作用:唯一标识content provider&其中的数据
外界进程通过URI找到对应的content provider&其中的数据,再进行数据操作
-
具体使用(自定义)
//设置uri
Uri parse = Uri.parse("content://com.carson.provider/User/1");
//指向的资源为:名为'com.carson.provider'
//的contentProvider中表名为‘User'中的'id'为1的数据
2.2MIME数据类型
- 指定某个拓展名的文件用某种应用程序来打开。如指定 .html文件采用text应用程序打开,指定.pdf文件采用flash应用程序打开。
ContentProvider.getType(uri);//根据uri,返回MIME类型。
2.ContentProvider类
- 2.1Contentprovider主要以表格的形式组织数据
同时也支持文件数据,只是表格的数据比较多。 - 主要方法,进程间共享数据的本质是:添加、删除、获取和修改数据。
<-- 4个核心方法 -->
public Uri insert(Uri uri, ContentValues values)
// 外部进程向 ContentProvider 中添加数据
public int delete(Uri uri, String selection, String[] selectio
nArgs)
// 外部进程 删除 ContentProvider 中的数据
public int update(Uri uri, ContentValues values, String select
ion, String[] selectionArgs)
// 外部进程更新 ContentProvider 中的数据
public Cursor query(Uri uri, String[] projection, String selec
tion, String[] selectionArgs, String sortOrder)
// 外部应用 获取 ContentProvider 中的数据
// 注:
// 1. 上述4个方法由外部进程回调, 并运行在ContentProvider进程的Binder
线程池中( 不是主线程)
// 2. 存在多线程并发访问, 需要实现线程同步
// a. 若ContentProvider的数据存储方式是使用SQLite & 一个, 则不需要, 因为SQLite内部实现好了线程同步,
// 若是多个SQLite则需要, 因为SQL对象之间无法进行线程同步
// b. 若ContentProvider的数据存储方式是内存, 则需要自己实现线程同步
<-- 2个其他方法 -->
public boolean onCreate()
// ContentProvider创建后 或 打开系统后其它进程第一次访问该ContentProvi
der时 由系统进行调用
// 注: 运行在ContentProvider进程的主线程, 故不能做耗时操作
public String getType(Uri uri)
// 得到数据类型, 即返回当前 Url 所代表数据的MIME类型
3.ContentObserver 类
内容观察者,观察Uri引起contentprovider中的数据变化并通知外界。
具体使用:
// 步骤1: 注册内容观察者ContentObserver
getContentResolver().registerContentObserver(uri);
// 通过ContentResolver类进行注册, 并指定需要观察的URI
// 步骤2: 当该URI的ContentProvider数据发生变化时,
// 通知外界( 即访问该ContentProvider数据的访问者)
public class UserContentProvider extends ContentProvider {
public Uri insert(Uri uri, ContentValues values) {
db.insert("user", "userid", values);
getContext().getContentResolver().notifyChange(uri, null);
// 通知访问者
}
}
// 步骤3: 解除观察者
getContentResolver().unregisterContentObserver( uri) ;
// 同样需要通过ContentResolver类进行解除
作者:木小伍
链接:https://www.jianshu.com/p/4b9b61f99069
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。