android中的contentprovider和contentResolver有什么区别

Aks*_*dam 40 android android-contentresolver android-contentprovider

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

use*_*184 49

我在这里找到了一些解释.综上所述

内容解析程序将URI解析为特定的内容提供程序.

Content Provider提供查询内容的界面.

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


Siv*_*ash 31

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

ContentResolver用于根据选择正确的ContentProvider ContentUris.ContentUri可能看起来像

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

  • content:// 称为scheme,表示它是ContentUri.
  • com.android.contacts称为内容权限,ContentResolver使用它来解析为唯一的提供者(在本例中为ContactProvider).
  • contacts是标识提供者数据的某个子集的路径(例如,表名).
  • 3是用于唯一标识数据子集内的行的id.

在此输入图像描述

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

有关详细信息,请参阅Android中的内容提供商

  • 赞成票数表明该答案应该已被接受。 (2认同)

Roh*_*ngh 9

两层抽象:

ContentResolver - > ContentProvider - > SQLiteDatabase

主要区别在于其他答案中提到的.

ContentProvider将应用程序的私有数据公开给外部应用程序,

ContentResolver使用URI在所有ContentProviders中提供正确的ContentProvider.

深入理解(两层抽象)

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

那么数据是如何共享的?

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

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

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

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

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


Eno*_*ogy 6

2021 年:D

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

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