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类进行解除

作者:木小伍
链接:https://www.jianshu.com/p/4b9b61f99069
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Content Provider详解(太懒不想抄)的更多相关文章

  1. Content Provider 详解

    几个概念:Cursor. Content provider . Uri  .contentresolver 1. Cursor : 个人理解为数据库中的一行数据,它是每行数据的集合.它是一个类.通过它 ...

  2. Content Providers详解

    今天仔细阅读了一遍Content Providers的官方API文档,总结了一下Android中Content Providers的用法. 各种类型的Content Provider对一个结构化的数据 ...

  3. android 四大组件详解

    这个文章主要是讲Android开发的四大组件,本文主要分为 一.Activity详解二.Service详解三.Broadcast Receiver详解四.Content Provider详解外加一个重 ...

  4. Android基础夯实--重温动画(四)之属性动画 ValueAnimator详解

    宝剑锋从磨砺出,梅花香自苦寒来:千淘万漉虽辛苦,吹尽狂沙始到金: 长风破浪会有时,直挂云帆济沧海 一.摘要 Animator类作为属性动画的基类,它是一个抽象类,它提供了实现动画的基本架构,但是我们不 ...

  5. AndroidMainfest详解

    基于TV settings和SettingsProvider Android启动模式对activity行为的影响 AndroidManifest.xml文件详解 Manifest文件中,applica ...

  6. JavaScript 各种遍历方式详解及总结

    JavaScript 各种遍历方式详解 在$.each中想要终止循环,但是它没有continue或者break这样的终止方式,所以尝试使用return来进行终止,但是发现并没有跳出循环.为了搞清楚js ...

  7. dsu on tree (树上启发式合并) 详解

    一直都没出过算法详解,昨天心血来潮想写一篇,于是 dsu on tree 它来了 1.前置技能 1.链式前向星(vector 建图) 2.dfs 建树 3.剖分轻重链,轻重儿子 重儿子 一个结点的所有 ...

  8. 入职小白随笔之Android四大组件——内容提供器详解(Content Provider)

    Content Provider 内容提供器简介 内容提供器(Content Provider)主要用于在不同的应用程序之间 实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的 ...

  9. content = "IE=edge,chrome=1" 详解

    content = "IE=edge,chrome=1" 详解 < meta http-equiv = "X-UA-Compatible" content ...

  10. TCP/IP详解学习笔记 这位仁兄写得太好了

      TCP/IP详解学习笔记(1)-基本概念 为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣 ...

随机推荐

  1. mybatis学习日记3

    1.mybatis的延迟加载 问题:在一对多中,当我们有一个用户,他有100个账户 在查询用户的时候,要不要把关联的账户查出来? 在查询账户的时候,要不要把关联的用户查出来? 解决:在查询用户的时候, ...

  2. P3_注册小程序账号&安装开发者工具

    注册小程序账号 点击注册按钮 使用浏览器打开 https://mp.weixin.qq.com/ 网址,点击右上角的"立即注册"即可进入到小程序开发账号的注册流程,主要流程截图如下 ...

  3. AEDR8300:光电编码程序构思

    一.实验 1.光电反射理论是经过码盘的window时,电压变低,经过bar时,电压为高,这样可以通过检测到的脉冲数,来进行速度的获取.但是实际并不是这样, 反馈回来的信号是周期性的,经过试验发现,可以 ...

  4. JavaScript的闭包和作用域

    作用域相关 作用域的概念: 作用域是在运行时代码中的某些特定部分中变量,函数和对象的可访问性.换句话说,作用域决定了代码区块中变量和其他资源的可见性: 作用域的类型: 全局作用域: 最外层函数和在最外 ...

  5. CentOS7加入AD域(winbind)

    作者:独笔孤行 官网:​​ ​http://anyamaze.com​​ 公众号:云实战 前言 AD域(Active Directory)是Windows服务器的活动目录,在目录中可以收录公司的电脑账 ...

  6. RabbitMQ基础和解疑

    一.基础概念 1. Producer:生产者,就是投递消息的一方 消息一般可以包含2个部分:消息体和标签(Label).消息体也可以称之为payload,在实际应用中,消息体一般是一个带有业务逻辑结构 ...

  7. vue element-ui table 实现自动滚动效果

    <el-table :data="tableData" stripe class="swiper-page-table" ref="table& ...

  8. IDEA 上传项目到 Gitee 小记

    此方式可直接将 IDEA 中项目上传到 Gitee 仓库,无需打开 Gitee 手动创建空仓库. 前提环境 安装好 Git,并在 IDEA 中成功配置: 注册有 Gitee 账号,并记得账号密码: I ...

  9. Java/.Net双平台核心,Jvm和CLR运行异同点

    前言: 本篇以.Net 7.0.2 CLR 和 OpenJDk19参照,解析下它们各自调用函数的异同. 以下为个人理解. 概述 JDK大约5.9G,CLR大约7.6G,两者相差1.7G左右. root ...

  10. [GKCTF2021]random

    [GKCTF2021]random 本题出现了MT19937伪随机数生成算法. 目录 [GKCTF2021]random 题目 分析 MT19937算法 步骤 代码实现 解法1 解法2 总结 题目 t ...