如何理解Android ContentProvider
来源:互联网 发布:淘宝店铺入驻蘑菇街 编辑:程序博客网 时间:2024/05/17 01:22
辛苦堆砌,转载请注明出处,谢谢!
本文不会教大家怎么使用ContentProvider,这些东西网上文章很多,书籍也不少,作为Android的四大组件之一,会用ContentProvider也是必须的。我会和大家聊聊我理解的ContentProvider,并给出一些什么时候可以使用它的建议,个人意见,仅供参考,也希望大家提出自己的看法。
ContentProvider江湖人称内容提供者,我更乐意简单的叫它CP。Google在官方API文档中有详细介绍,我只摘出几句具有代表性的:
Content providers are one of the primary building blocks of Android applications, providing content to applications.
CP是Android应用的主要构建模块,它向应用提供内容。
A content provider is only required if you need to share data between multiple applications.
如果你需要在不同的应用之间共享数据,你可以使用CP。
If you don't need to share data amongst multiple applications you can use a database directly via SQLiteDatabase.
如果你不需要在不同的应用之间共享数据,你可以直接使用SQLiteDatabase直接访问数据库。
看到上面三句话,一开始给我最直观的感受有以下几点:
CP用来提供内容,内容就是数据;
CP的应用场合是要将本应用的数据共享给其他应用;
CP主要用来共享数据库的数据;
如果不共享数据,我们就不用使用CP。
说实话,经过实践,现在看这些Google的说明,写的不是很好,有点误导人,首先,CP是提供数据内容,但是不单单用来提供数据库的数据;其次,CP不仅可以用来共享数据,它的主要作用是提供数据;最后,本应用中不共享数据,不能阻止我们使用CP。
本来以为Google可能不太会写文档,但是看了ContentProvider使用指南中的说明,我觉得应该是Google没有更新API文档吧,指南中的说明更切合实际,下面是Google中国开发者网站的说明,摘几句关键的:
内容提供程序管理对结构化数据集的访问。它们封装数据,并提供用于定义数据安全性的机制。内容提供程序管理对结构化数据集的访问。它们封装数据,并提供用于定义数据安全性的机制。
如果您不打算与其他应用共享数据,则无需开发自己的提供程序。 不过,您需要通过自己的提供程序在您自己的应用中提供自定义搜索建议。 如果您想将复杂的数据或文件从您的应用复制并粘贴到其他应用中,也需要创建您自己的提供程序。
这么看,Google的文档挽回了自己的尊严XD。这里的内容提供程序就是CP,这里我们看到了截然不同的内容,也是我想和大家聊的:
一、CP是结构化数据访问的手段
如果大家接触过Linux系统,应该了解Linux提供了一个虚拟文件系统,正是这个虚拟文件系统的作用,使得Linux能够支持的文件系统远远多于Windows,更让Windows惭愧的是,Linux连Windows的FAT32和NTFS也是支持的。
为什么会这样?原因在于Linux通过虚拟文件系统,向应用层提供了一套标准的接口,内核中,开发者只要对不同的文件系统进行适配,使其符合这套标准接口,应用层就都可以操作了。接触Java多一些的,应该也想到了另一个例子——JDBC。
实际上,CP也是这样的一个接口层,它向外界隐藏了其下具体的结构化数据提供方式(如SQLite数据库或者是SharedPreferences),而提供了一套统一的访问数据的接口。我们通过合适的URI进行数据访问,把数据当做一种资源,这种资源都可以通过CP提供的访问方式进行访问,这样,就实现了数据提供的具体手段与使用数据的逻辑之间的解耦。
找个现实生活中的例子,比如我们去派出所查户籍信息,我们到服务台,找到对应的警员,和他说我们要查户籍信息,无论你去哪个派出所,你可能都要提供你的姓名和身份证号,这就足够了,你没有必要去操心警员是通过电脑给你查到的信息,还是通过人工翻阅资料查询的,你只关心最后他交给了你想要的数据,其他的和你没有关系。
二、不共享数据也能使用CP
如果我们对数据库的访问,或者更广泛一些,对结构化数据的访问很多,会分散在代码中的各处,我们不妨使用CP,使用CP,我们可以将结构化数据的访问封装进一个类当中,而通过统一的接口对其进行访问,这样,我们不必重复打开数据资源,也不必在各处分别关心数据资源的初始化和释放(比如数据库打开和关闭),我们只要处理好CP的接口,应用程序会在合适的时间初始化CP并初始化数据资源,在我们不需要的时候释放资源。这样,对应用的性能也有一定的好处,比如频繁的关闭打开数据库对应用的性能会有较大的影响,而使用CP,我们的应用可能仅需要打开一次数据库即可。
三、提供安全访问数据的机制
通过CP访问数据,只能通过URI进行访问,这样,我们就能够实现自己的安全机制,另外,我们还保证了资源的初始化和有效回收,这一系列,都是我们分散访问数据无法顾全的。如果我们的CP只是本应用内使用,可以不向外界公开数据,只需要exported属性为false即可。
什么时候使用CP呢?当我们需要提供统一的接口和相同的模式安全访问数据时,我们就可以使用CP。
- 如何理解Android ContentProvider
- 如何理解ContentProvider?(通讯录)
- Android ContentProvider理解与实践
- 在android如何使用ContentProvider
- Android 如何自定义一个ContentProvider
- 深入理解Android四大组件之一ContentProvider
- 深入理解Android四大组件之一ContentProvider
- Android<我所理解的ContentProvider>
- Android中ContentProvider的理解使用
- ContentProvider理解
- android ContentProvider中getType(Uri uri)的理解
- android ContentProvider中getType(Uri uri)的理解
- android ContentProvider中getType(Uri uri)的理解
- Android中关于ContentProvider类的getType()方法的理解
- Android笔记--对Service、Object、Contentprovider、泛型的理解
- Android四大组件 Activity BroadCast ContentProvider Service 的理解
- android contentprovider
- android contentprovider
- Java ---理解MVC架构
- 学习的内容1 python字符串
- 历届试题 矩阵翻硬币
- 判断字符串是否为回文
- FancyDialog对话框
- 如何理解Android ContentProvider
- 剑指offer33:把数组排成最小的数
- 变量的解构赋值
- Git版本管理学习与应用
- 文件读写(python 3.5)
- 《Java高并发程序设计》学习 --7.1 Akka之Hello World
- 常用显示接口技术
- React-native学习过程 六 flexbox伸缩容器属性
- Ubuntu处于一直连接状态,却连不上网