ContentProviders和ContentResolver有什么区别?我不想换SQLite
数据库。我正在开发媒体应用程序。
4 回答
我在这里找到了一些解释。总之
Content Resolver将 URI 解析为特定的Content provider。
Content Provider提供了一个接口来查询内容。
查询内容提供者的方法是contentResolverInstance.query(URI,.....)
ContentProviders
用于从其他部分抽象数据库,并充当数据库和 UI/其他类之间的接口。您必须创建自己的 ContentProvider才能与其他应用程序共享您的应用程序数据。
ContentResolver
用于根据ContentUris
. ContentUri 可能看起来像
内容://com.android.contacts/contacts/3
- content:// 称为方案,表示它是一个 ContentUri。
- com.android.contacts被称为Content authority,ContentResolver 使用它来解析一个唯一的提供者(在本例中为 ContactProvider)。
- 联系人是标识提供者数据的某些子集的路径(例如,表名称)。
- 3是用于唯一标识数据子集中的行的id 。
注意:您自己的应用程序也可以使用此路由来处理其数据。
有关更多详细信息,请参阅Android 中的内容提供程序
两层抽象:
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 等的示例代码,但它没有很好的文档记录。
2021 年:D
内容解析器:用于数据请求
内容提供者:用于数据响应