四、Content Provider详解(太懒不想抄)

2021-09-23  本文已影响0人  木小伍

1.Content Provider作用

进程间进行数据交互&共享,即跨进程通信


contentprovider作用图.png

2.Content Provider原理

content provider底层是采用Android中Binder机制。

2.1统一资源标识符(URI)

外界进程通过URI找到对应的content provider&其中的数据,再进行数据操作

        //设置uri
        Uri parse = Uri.parse("content://com.carson.provider/User/1");
        //指向的资源为:名为'com.carson.provider'
        //的contentProvider中表名为‘User'中的'id'为1的数据
2.2MIME数据类型
  ContentProvider.getType(uri);//根据uri,返回MIME类型。

2.ContentProvider类

<-- 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类进行解除
上一篇下一篇

猜你喜欢

热点阅读