ContentResolver用法

loc*_*loc 7 android-contentresolver

我是andriod domain的新手,正处于学习阶段.我收到了几个问题:

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

小智 14

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

什么是内容解析器?

内容解析器是应用程序中的单个全局实例,它提供对您(和其他应用程序)内容提供程序的访问.内容解析器的行为与其名称完全相同:它接受来自客户端的请求,并通过将这些请求指向具有不同权限的内容提供程序来解析这些请求.为此,内容解析器存储从权限到内容提供者的映射.这种设计很重要,因为它允许访问其他应用程序的内容提供商的简单而安全的方法.

内容解析器包括与Content Provider类中的抽象方法(插入,删除,查询,更新)相对应的CRUD(创建,读取,更新,删除)方法.内容解析器不知道它正在与之交互的内容提供者的实现(也不需要知道); 每个方法都传递一个URI,指定要与之交互的Content Provider.

什么是内容提供商?

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

内容提供商使用content:// schema基于简单的URI寻址模型提供发布和使用数据的界面.它们使您能够从底层数据层中提取应用程序层,通过抽象底层数据源使您的应用程序数据源不可知.

查询的生命

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

  • 打电话getContentResolver().query(Uri, String, String, String, String)了.该调用调用Content Resolver的查询
    方法,而不是ContentProvider's.

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

  • 内容解析程序将请求定向到使用(唯一)权限注册的内容提供程序.这是通过调用
    Content Provider的query方法完成的.

  • Content Provider's query调用该方法时,将执行查询并返回Cursor(或抛出异常).该
    结果的行为,完全取决于内容提供商的
    执行情况.