ContentProviders 和 ContentResolver 之间有什么区别?我不想要SQLite
数据库。我正在开发一个媒体应用程序。
答案 0 :(得分:48)
我找到了一些解释here。总结
内容解析器将URI解析为特定内容提供商。
Content Provider 提供查询内容的界面。
查询内容提供商的方式是contentResolverInstance.query(URI,.....)
答案 1 :(得分:26)
ContentProviders
用于从其他部分抽象数据库,并充当数据库和UI /其他类之间的接口。您必须创建自己的ContentProvider 以与其他应用分享您的应用数据。
ContentResolver
用于根据ContentUris
选择正确的ContentProvider。 ContentUri可能看起来像
内容://com.android.contacts/contacts/3
注意:您自己的应用也可以使用此路线来处理其数据。
有关详细信息,请参阅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数据库中的数据公开给其他应用程序,而无需通知数据库的实现。