为什么创建Android的ContentProvider?


11

标题总结了我的问题,但基本上我想理解的是,为什么Android设计人员希望需要与共享数据一起使用的应用程序使用Content Provider,而不是直接访问SQLite数据库?

我能想到的唯一原因就是安全性,因为某些文件只能通过某些进程来访问,因此Content Provider是网守,可以确保每个应用程序在允许对数据库文件的读取和/或写入访问之前都具有适当的特权。这是创建ContentProvider的主要原因吗?

Answers:


6

首先,它是隔离数据使用者和数据提供者的一种方式。如果要公开某些数据或至少对其他应用程序可用,则可以开发自己的内容提供商或扩展现有的内容提供商。

的确,这可以使服务器从安全的角度控制访问,但是它还允许您在需要时重新设计数据的物理实现。在这种情况下,您需要做的就是调整内容提供商的后端。数据使用者应用程序将不必重写。他们将通过其内容解析器继续访问您的数据,而不会意识到实际基础实现中的任何更改。

此外,即使数个客户端访问了数据,Android也会仅实例化内容提供程序的一个实例,因此它可以处理并发访问,而无需您担心。

最后,我相信它将解决启动和关闭过程的繁琐工作。


1
我认为绝缘可能是最好的答案。我不同意您关于并发访问的观点,SQLite和Android Java接口处理并发,ContentProvider本身允许多个并发线程来查询/插入/更新,因此它实际上并没有为您做任何事情。
satur9nine 2011年

3

ContentProvider也抽象了一切是为了与其他第三方应用程序进行通信所需要的进程间通信。必须自己编写此代码将是一个巨大的痛苦。


第三方始终可以直接访问数据库文件,而无需在那里进行进程间通信。
satur9nine 2012年

我不确定您的意思是...如果某个应用程序是“第三方”,那么根据定义它必须存在于不同的进程中(因为每个Android应用程序都有其自己的主进程)。另外,如果Android OS允许您直接访问其他应用程序的原始数据存储,那将引发一些相当大的安全性问题。
亚历克斯·洛克伍德

1

ContentProvider还是一种抽象,它隐藏了如何存储/生成数据的详细信息。例如,在我的一个应用程序中,我有一个内容提供程序,可返回PNG图像。这些图像不会存储在任何地方,它们是按需生成的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.