android中的contentprovider和contentResolver有什么区别

时间:2013-09-18 14:21:22

标签: android android-contentprovider android-contentresolver

ContentProviders ContentResolver 之间有什么区别?我不想要SQLite数据库。我正在开发一个媒体应用程序。

5 个答案:

答案 0 :(得分:48)

我找到了一些解释here。总结

内容解析器将URI解析为特定内容提供商

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

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

答案 1 :(得分:26)

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

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

  

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

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

enter image description here

  

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

有关详细信息,请参阅Content Providers in Android

答案 2 :(得分:7)

两层抽象:

ContentResolver - > ContentProvider - > SQLiteDatabase

  

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

     

ContentProvider将您的应用程序的私有数据公开给外部应用程序
  而
  ContentResolver使用URI在所有ContentProviders中提供正确的ContentProvider。

深入理解(双层抽象)

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

如何共享数据?

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

  

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

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

  

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

希望你有更好的理解 您还可以看到一些示例代码here,用于创建SQLitedatabase,ContentProvider等,但它没有详细记录。

答案 3 :(得分:2)

2020年:D

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

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

答案 4 :(得分:0)

迟到总比不到好。我找到了一个很好的实用解释。演示

假设您要从银行提款。您将必须执行以下步骤

ABC银行(内容解析器)中的出纳机-> ABC银行网关(内容提供商)->银行服务器(数据库)。

出纳员既不了解银行网关的实现,也不了解银行数据库

以相同的方式,内容解析器将查询内容提供者,而ContentProvider会将存储在SQLite数据库中的数据公开给其他应用程序,而无需通知数据库的实现。