为什么需要ContentProvider?

我们知道,一个软件系统的架构通常是这样的:

为了降低上层业务对底层数据的依赖,需要增加一个数据访问层来解耦,我们今天要说的ContentProvider充当的就是数据访问层的角色。ContentProvider提供了一些通用的接口来实现对底层数据(其实是数据库中的表结构数据)进行操作。

ContentProvider是什么?

ContentProvider是Android提供给上层的一个组件,主要用于实现数据访问的统一管理和数据共享。这里的数据管理是通过定义统一的访问接口来完成,如增删改查。同时,它采用了类似Internet的URL机制,将数据以URI的形式来标识,这样其他App就可以采用一套标准的URI规范来访问同一处数据,而不用关心具体的实现细节。我们知道在Android系统中可能会涉及到一个App的数据被其他App使用的情况,比如通讯录,日历,短信等,这时就需要一套能实现数据共享的机制,这里的ContentProvider就可以提供该功能,其底层使用了binder来完成App进程之间的通信,同时使用匿名共享内存来作为共享数据的载体。当然为了保证数据访问的安全性,ContentProvider还对每处的数据URI增加了权限管理机制,以控制该数据的访问者及访问方式。

如何使用ContentProvider?

ContentProvider提供了一套通用的数据访问接口,示例代码如下:

public class MyContentProvider extends ContentProvider {public MyContentProvider() {}@Overridepublic boolean onCreate() {// TODO: Implement this to initialize your content provider on startup.return false;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {// TODO: Implement this to handle query requests from clients.throw new UnsupportedOperationException("Not yet implemented");}@Overridepublic String getType(Uri uri) {// TODO: Implement this to handle requests for the MIME type of the data// at the given URI.throw new UnsupportedOperationException("Not yet implemented");}@Overridepublic Uri insert(Uri uri, ContentValues values) {// TODO: Implement this to handle requests to insert a new row.throw new UnsupportedOperationException("Not yet implemented");}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {// Implement this to handle requests to delete one or more rows.throw new UnsupportedOperationException("Not yet implemented");}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {// TODO: Implement this to handle requests to update one or more rows.throw new UnsupportedOperationException("Not yet implemented");}
}

咋一看,这些接口貌似跟数据库的访问接口类似。没错,ContentProvider就是专门来管理数据库中的数据的。那么既然作为通用的数据访问接口,ContentProvider为什么没有提供对普通文件的访问接口呢?我猜测是因为普通文件的数据是非结构化的,无法抽象出一套统一的访问接口,而数据库中的数据都是结构化数据,就相对比较容易了。

此外一般我们不会直接使用ContentProvider来访问,而是会通过ContentResolver来访问ContentProvider,为什么?因为ContentProvider作为一个数据源处理中心,不止给App内部使用,还会被其他App访问。所以这里的ContentProvider就好比一个server,其他的App在访问这个ContentProvider的时候都必须先获得一个Server的Client才行,这里的ContentResolver就是Android提供给开发者使用来得到一个ContentProvider Client的管理工具类。示例代码如下:

//根据号码获取联系人的姓名
public void getContactNameByNumber() throws Exception {ContentResolver resolver = getContentResolver();Cursor cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI, new String[]{ContactsContract.Data.DISPLAY_NAME}, null, null, null);if(cursor.moveToFirst()){String name = cursor.getString(0);Log.i(TAG, name);}cursor.close();
}

此外我们在创建一个ContentProvider组件的时候,必须要声明一个authorities,并且必须保证系统内该字段不重名,它就好比URL中的主机地址。示例如下:

<providerandroid:name=".MyContentProvider"android:authorities="com.xiaofei"android:enabled="true"android:exported="true">

最后再说下为何ContentProvider在我们平时开发App中使用的不多?其实,虽然ContentProvider具有数据管理和数据共享的功能,但是多半的优势还是集中在数据共享上,在数据共享的前提下,这个数据管理的优势也才能更加明显。像一些系统内置应用,联系人,日历和短信,就比较适合使用ContentProvider,因为他们经常需要给其他App提供数据。而对于像普通App,一般出于安全原因,不会把数据提供给第三方App使用,而在App内部访问数据库的话,完全可以自己实现一套数据库访问框架,因为ContentProvider为了屏蔽数据库的访问细节,实质上是在其基础上再封装了一层接口而已,而对于App内部的数据库访问来说,没有这个必要,而且ContentProvider作为一个组件与系统依赖性较强,相比自己实现一套数据库管理框架,扩展性和灵活性肯定没那么好。当然也有很多第三方开源的数据库框架可用,比如greenDao,ormlite,realm等。

ContentProvider使用场景解读相关推荐

  1. Kubernetes 弹性伸缩全场景解读(五) - 定时伸缩组件发布与开源

    作者| 阿里云容器技术专家刘中巍(莫源) 导读:Kubernetes弹性伸缩系列文章为读者一一解析了各个弹性伸缩组件的相关原理和用法.本篇文章中,阿里云容器技术专家莫源将为你带来定时伸缩组件  kub ...

  2. Broadcast使用场景解读

    在之前的一篇文章<基于场景解读Android四大组件>谈到BroadcastReceiver是Android提供给开发者的一个组件,主要用来完成前台和后台之前的通信,也就是Activity ...

  3. 海量结构化数据解决方案-表格存储场景解读

    简介: 数据是驱动业务创新的最核心的资产.不同类型的数据如非结构化数据(视频.图片等).结构化数据(订单.轨迹),面向不同业务的使用要求需要选择适合的存储引擎,能够真正发挥数据的价值.针对于海量的非强 ...

  4. 构建全渠道零售平台及营销场景解读

    阅读原文 1.中国"新零售"发展趋势与机遇 根据阿里研究院与BCG合作的<中国消费新趋势>研究报告显示,在未来5年, "新零售"将激活总共六万亿美元 ...

  5. Kubernetes 弹性伸缩全场景解读(二)- HPA 的原理与演进

    前言 在上一篇文章 Kubernetes 弹性伸缩全场景解析 (一):概念延伸与组件布局中,我们介绍了在 Kubernetes 在处理弹性伸缩时的设计理念以及相关组件的布局,在今天这篇文章中,会为大家 ...

  6. PPT 下载 | 神策数据孙超赟:多场景解读运营的价值、生存状态与解决方案

    本文为神策数据业务咨询师孙超赟在<深挖用户存量价值,释放运营想象力>主题沙龙中分享的<神策智能运营案例分享>的主题演讲整理所得. 温馨提示:点击阅读原文,可下载完整版演讲 PP ...

  7. 实时计算 Flink 版应用场景解读

    简介:本文由阿里巴巴高级产品专家陈守元老师分享,详细讲解实时计算 Flink 的具体业务场景并分享实时计算 Flink 的相关应用案例. 作者:陈守元(巴真),阿里巴巴高级产品专家 摘要:本文由阿里巴 ...

  8. Kubernetes弹性伸缩全场景解读(五) - 定时伸缩组件发布与开源

    前言 容器技术的发展让软件交付和运维变得更加标准化.轻量化.自动化.这使得动态调整负载的容量变成一件非常简单的事情.在kubernetes中,通常只需要修改对应的replicas数目即可完成.当负载的 ...

  9. 蓝牙室内定位技术系统应用场景解读

    现代制造业厂区面积大.人员数量多.物资设备不断增加,随着工业信息化技术的发展,大型制造企业中对人员.车辆.物资的管理要求越来越细致.传统的制造业工厂普遍存在人员位置不可知.人员监管系统效率低.无可视化 ...

最新文章

  1. XML文件处理的思考
  2. 爬虫-06-通用爬虫与聚焦爬虫
  3. iOS-文件断点续传
  4. gradle_Gradle
  5. 一台mysql数据库服务器_在一台服务器安装多个MySQL数据库
  6. 百度地图离线API及地图数据下载工具-尝鲜篇
  7. 结构方程模型-中介效应检验(Amos)
  8. 江西宜春三名公务员擅自驾公车钓鱼被通报-公车钓鱼-公务员-公车
  9. 根域名服务器的一点理解
  10. bzoj1616 [Usaco2008 Mar]Cow Travelling游荡的奶牛 [BFS]
  11. Windows目录结构、移动、复制、搜索文件及文件夹等
  12. MVT模型<->前后端不分离前后端分离模板引擎
  13. Spread.NET 14.0 Crack 最新版
  14. FPGA IN 消费电子
  15. 算法笔记5.5 质因子分解
  16. 计算机微课作品 ppt,微课认识计算机.ppt
  17. 简单实现CSS导航栏二级菜单从上往下平滑滑下弹出效果
  18. 【钱要花到刀刃上,该省省,该花花】你真的知道你花费到哪里去了吗?Python统计微信消费,生成微信消费账单。
  19. 关于win10几分钟无任何操作就假死机,就只有鼠标能动
  20. 多张图片怎么合成gif?

热门文章

  1. python 红黑树_python学习笔记|红黑树(性质与插入)
  2. adb cannot connect to daemon_手机触屏失效的抢救办法,以及如何利用adb实现PC与手机交互...
  3. Java 获取并计算程序执行时间
  4. PHPExcel开发者文档[中文版]
  5. JAVA中定义常量的几种方式
  6. 三大平衡树(Treap + Splay + SBT)总结+模板
  7. 百度之星12月30号题目之维基解密
  8. 话里话外:浅淡对流程管理的认识及流程管理对企业价值
  9. Mobile 拨打电话 发送短信
  10. 在Linux下正确安装VMWARE TOOLS