美文网首页
四、Content Provider详解(太懒不想抄)

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

作者: 木小伍 | 来源:发表于2021-09-23 14:10 被阅读0次

    1.Content Provider作用

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


    contentprovider作用图.png

    2.Content Provider原理

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

    2.1统一资源标识符(URI)
    • 作用:唯一标识content provider&其中的数据

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

    • 具体使用(自定义)


      自定义URI
            //设置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类进行解除
    

    相关文章

      网友评论

          本文标题:四、Content Provider详解(太懒不想抄)

          本文链接:https://www.haomeiwen.com/subject/jleggltx.html