52

ContentProvidersContentResolver有什么区别?我不想换SQLite数据库。我正在开发媒体应用程序。

4

4 回答 4

64

我在这里找到了一些解释。总之

Content Resolver将 URI 解析为特定的Content provider

Content Provider提供了一个接口来查询内容。

查询内容提供者的方法是contentResolverInstance.query(URI,.....)

于 2013-09-18T14:31:10.807 回答
50

ContentProviders用于从其他部分抽象数据库,并充当数据库和 UI/其他类之间的接口。您必须创建自己的 ContentProvider才能与其他应用程序共享您的应用程序数据

ContentResolver用于根据ContentUris. ContentUri 可能看起来像

内容://com.android.contacts/contacts/3

  • content:// 称为方案,表示它是一个 ContentUri。
  • com.android.contacts被称为Content authority,ContentResolver 使用它来解析一个唯一的提供者(在本例中为 ContactProvider)。
  • 联系人是标识提供者数据的某些子集的路径(例如,表名称)。
  • 3是用于唯一标识数据子集中的行的id 。

在此处输入图像描述

注意:您自己的应用程序也可以使用此路由来处理其数据。

有关更多详细信息,请参阅Android 中的内容提供程序

于 2016-11-12T11:34:16.137 回答
20

两层抽象:

ContentResolver --> ContentProvider --> SQLiteDatabase

主要区别在于其他答案中提到的这一点。

ContentProvider 将应用程序的私有数据暴露给外部应用程序
,而
ContentResolver 使用 URI 在所有 ContentProvider 中提供正确的 ContentProvider。

更深入的理解(两层抽象)

让我们绕道而行。
我们都知道,当我们创建 SQLite 数据库时,该数据库对您的应用程序保持私有,这意味着您不能与任何其他外部应用程序共享您的应用程序数据。

那么数据是如何共享的呢?

ContentProvider 和 ContentResolver 是android.content包的一部分。这两个类一起工作以在应用程序之间提供健壮、安全的数据共享模型。
ContentProvider将存储在 SQLite 数据库中的数据暴露给其他应用程序,而无需告诉他们数据库的底层实现。
所以它抽象了 SQliteDatabase。但是等等有一个问题
外部应用程序不能直接访问 ContentProvider。为此,您需要首先与另一个名为 ContentResolver 的类进行交互,将 ContentResolver 视为 ContentProvider 查找器。它只有一个实例,并且您设备的所有 ContentProvider 都使用简单的命名空间 URI 进行注册。如果你想访问一个特定的 ContentProvider,你只需要知道它的 URI。将其传递给 ContentResolver,它将使用 URI 找到提供者。
现在让我们看看最重要的方法 getContentResolver().query(URI,String[] proj.....)

getContentResolver().query(URI,String[] proj.....)被调用时会发生什么

query()方法属于 ContentResolver 类,但是它调用已解析 ContentProvider 的抽象 query() 方法并返回 Cursor 对象。
通过这种方式,外部应用程序通过两个抽象层暴露给私有数据库。

只是为了添加更多点
您无法创建自己的 ContentResolver 类,但您始终可以创建自己的 ContentProvider 类

希望你有更好的理解
你也可以在这里看到一些用于创建 SQLitedatabase、ContentProvider 等的示例代码,但它没有很好的文档记录。

于 2017-12-12T12:32:34.453 回答
3

2021 年:D

内容解析器:用于数据请求

内容提供者:用于数据响应

于 2020-03-07T06:19:47.817 回答