如何理解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直接访问数据库。


看到上面三句话,一开始给我最直观的感受有以下几点:

  1. CP用来提供内容,内容就是数据;

  2. CP的应用场合是要将本应用的数据共享给其他应用;

  3. CP主要用来共享数据库的数据;

  4. 如果不共享数据,我们就不用使用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。



1 0
原创粉丝点击