12

我是安卓领域的新手,正处于学习阶段。我有几个查询:

每个应用程序是否有一个 ContentResolver 对象?它是一个单例对象吗?谁管理这个对象生命周期?如果是单例的,它如何处理多个查询 ContentProvider 的请求?

4

1 回答 1

22

来自 Alex Lockwood 的博客 - http://www.androiddesignpatterns.com/2012/06/content-resolvers-and-content-providers.html

什么是内容解析器?

内容解析器是您的应用程序中的单个全局实例,它提供对您(和其他应用程序的)内容提供者的访问。内容解析器的行为正如其名称所暗示的那样:它接受来自客户端的请求,并通过将这些请求定向到具有不同权限的内容提供者来解析这些请求。为此,内容解析器存储了从权限到内容提供者的映射。这种设计很重要,因为它允许以简单且安全的方式访问其他应用程序的内容提供程序。

Content Resolver 包括与 Content Provider 类中的抽象方法(插入、删除、查询、更新)对应的 CRUD(创建、读取、更新、删除)方法。Content Resolver 不知道与之交互的 Content Providers 的实现(也不需要知道);每个方法都传递一个 URI,该 URI 指定要与之交互的 Content Provider。

什么是内容提供者?

内容解析器提供应用程序内容提供者的抽象,而内容提供者提供底层数据源(即 SQLite 数据库)的抽象。它们提供了定义数据安全性的机制(即通过强制读/写权限),并提供了一个标准接口,将一个进程中的数据与另一个进程中运行的代码连接起来。

内容提供者基于使用 content:// 模式的简单 URI 寻址模型为发布和消费数据提供了一个接口。它们使您能够将应用程序层与底层数据层分离,通过抽象底层数据源使您的应用程序数据源不可知。

查询的生命周期

那么简单查询背后的分步过程到底是什么?如上所述,当您通过内容提供程序从数据库中查询数据时,您不会直接与提供程序通信。相反,您使用 Content Resolver 对象与提供者进行通信。下面给出了进行查询时发生的特定事件顺序:

  • 发出呼叫getContentResolver().query(Uri, String, String, String, String)。该调用调用内容解析器的查询
    方法,而不是ContentProvider's.

  • query调用该方法时,内容解析器解析uri 参数并提取其权限。

  • 内容解析器将请求定向到向(唯一)授权注册的内容提供者。这是通过调用
    Content Provider 的query方法来完成的。

  • 调用该Content Provider's query方法时,将执行查询并返回 Cursor(或引发异常)。产生的
    行为完全取决于 Content Provider 的
    实现。

于 2014-01-10T11:09:40.173 回答