我是andriod domain的新手,正处于学习阶段。我收到了几个疑问:
每个应用都有单个ContentResolver对象吗? 它是单身对象吗? 谁管理这个对象生命周期? 如果它是单例,它如何处理查询ContentProvider的多个请求?
答案 0 :(得分:14)
来自Alex Lockwood的博客 - http://www.androiddesignpatterns.com/2012/06/content-resolvers-and-content-providers.html
什么是内容解析器?
内容解析器是您的单一全局实例 提供对您(和其他应用程序)的访问的应用程序 内容提供商。内容解析器的行为与其名称完全相同 暗示:它接受来自客户端的请求,并解析这些请求 通过将它们指向具有不同权限的内容提供者。 为此,内容解析器存储权限到的映射 内容提供商。这种设计很重要,因为它允许简单和 访问其他应用程序的内容提供商的安全方法。
内容解析器包括CRUD(创建,读取,更新,删除) 对应抽象方法的方法(插入,删除,查询, 在Content Provider类中更新)。内容解析器没有 了解它正在进行交互的内容提供商的实施 与(也不需要知道);每个方法都传递一个URI 指定要与之交互的内容提供者。
什么是内容提供商?
而内容解析器提供了抽象 应用程序的内容提供商,内容提供商提供 从底层数据源(即SQLite数据库)的抽象。 它们提供了定义数据安全性的机制(即通过强制执行) 读/写权限)并提供连接的标准接口 代码在另一个进程中运行的一个进程中的数据。
内容提供商提供发布和使用的界面 数据,基于简单的URI寻址模型使用内容:// 架构。它们使您可以从应用程序中提取应用程序层 底层数据层,使您的应用程序与数据源无关 通过抽象底层数据源。
查询的有效期
那么简单查询背后的逐步过程到底是什么?如 如上所述,当您通过数据库查询数据库中的数据时 内容提供商,您不直接与提供商沟通。 而是使用Content Resolver对象与 供应商。查询所在的特定事件序列 制作如下:
拨打
getContentResolver().query(Uri, String, String, String, String)
。该调用调用内容解析器的查询
方法,而不是ContentProvider's
。调用
query
方法时,内容解析器会解析uri
参数并提取其权限。内容解析程序将请求定向到使用(唯一)权限注册的内容提供程序。这是通过调用
来完成的 内容提供商的query
方法。调用
Content Provider's query
方法时,将执行查询并返回Cursor(或抛出异常)。该
产生的行为完全取决于Content Provider的 实施