ContentProvider(内容提供器)概念篇

前言

What is the key,when we learn something?先来拽一句英语,也就是说当我们学习一个技术点的时候,我们应该学习的是什么?我认为最应该学习的是它背后的思想以及逻辑。接下来我们就从概念上,或者说从更高的角度来看ContentProvider,它究竟是个什么鬼,体现了什么思想,有什么可以借鉴的。

ContentProvider的作用

Content providers can help an application manage access to data stored by itself, stored by other apps, and provide a way to share data with other apps. They encapsulate the data, and provide mechanisms for defining data security.

译文:ContentProvider能帮助App管理自身及其他App数据的存取,它提供了一种与其他App共享数据的方式。他们将这些数据进行了封装,并提供了一种数据安全机制。

以上是谷歌文档对ContentProvider的定义,它在开篇第一段便开门见山的陈述了ContentProvider到底是什么。它的作用是为了实现App之间的数据共享。再有就是它对于数据的共享提供了一种安全机制,为什么说是一种安全的机制,通过下图我认为已经可以理解了,Other applications即其他程序想要访问我们的App数据时,它们是不能直接访问我们的数据文件的,因为直接访问数据文件的权限简直是太大了,而且不可控,你可能会想到文件不都有自己的权限机制吗?为什么还要在程序中进行控制?这个问题问的好,你仔细想一下,如果我们只想让其他程序读取我们的部分内容,进行部分内容的修改和删除以及添加,那么显然文件的权限机制就有了它的弊端,再者我们数据来源不一定就是文件。因此这里就引入了一个中间者的概念,它的作用就是来限制其他程序的访问权限,所有的请求都要经过它的批准,然后再由它来进行数据的操作。而非直接将数据文件的操作权限交给别人。要是碰上一个不地道的人,一个delete之后数据岂不凉凉。这个中间者也就是ContentProvider,它的作用就是对数据请求者进行操作的限制,并处理具体的数据请求。

以上可能说的不是通俗易懂,这里我们举一个例子来说明ContentProvider的安全机制。比如说有一天你结婚去办理结婚证,你是不是要去民政局进行办理呀,而且会有专门的负责人员来帮你进行办理,你把个人信息交给人家完事人家进行校验后决定是否为你办理,要是你还跟别人存在婚姻关系,那么你肯定是不能再办理的,民政局不可能会说你自己打开电脑弄吧,那你一个人不就多娶了一个媳妇,再或者你把别人的信息给抹掉了,这样的话岂不乱套了。例子中的负责人便是我们所说的ContentProvider,想要办理结婚登记的这个人便是其他的App,这个办理结婚登记便是一个数据的请求,负责人进行校验便是对权限的控制。

ContentProvider出现的目的是为了安全的对外提供数据,不过它的作用/好处不光是这个,这便是我们下一段要谈的。

ContentProvider体现的设计思想

ContentProvider的出现将数据访问与具体的数据存储实现进行了隔离,什么意思呢,看下图,当Other applications想要获取我们App中的数据时,它直接来找ContentProvider,至于说数据是来自Internet、Sqlite、File还是其他形式,Other applications是不关心的,它仅关心数据如何请求,只要请求方式不发生变化,也就是说ContentProvider提供的接口不变,那么Other applications程序内部就无需发生变化。假如我们抛去直接访问数据文件带来的安全隐患,我们可以直接访问其他程序的数据文件,于是我们写了很多对于数据文件操作的类以及函数,这时你就要想了,如果别人的程序更换了数据存储方式,那么所带来的就是你也需要将自己的程序进行更改和调整。如果采用ContentProvider这种隔离的方式就可以完全避免,因为具体的数据处理交给了ContentProvider来实现,至于ContentProvider如何进行数据存取,对于数据请求者来说是无需关心的,这也就避免了所谓的代码地震。

这就是使用接口来隔离具体实现的思想,其实我们最常见的体现就是在数据访问层上,假如数据存储方式发生了变化,如何实现无代码地震的优雅替换。那就要使用Interface了,由于篇幅及主题内容限制这里不再展开叙述有兴趣可以关注我的下一篇文章《带你看破接口多态、工厂模式》。

最后

参考文献:

Content providers-Overview:https://developer.android.com/guide/topics/providers/content-providers