Aks*_*dam 40 android android-contentresolver android-contentprovider
ContentProviders和ContentResolver有什么区别?我不想要SQLite数据库.我正在开发一个媒体应用程序.
Siv*_*ash 31
ContentProviders用于从其他部分抽象数据库,并充当数据库和UI /其他类之间的接口.您必须创建自己的ContentProvider 才能与其他应用分享您的应用数据.
ContentResolver用于根据选择正确的ContentProvider ContentUris.ContentUri可能看起来像
内容://com.android.contacts/contacts/3
注意:您自己的应用程序也可以使用此路由来处理其数据.
有关详细信息,请参阅Android中的内容提供商
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等,但它没有很好的文档.