Content Providers

什么是ContentProvider

Android四大组件之一,实现各个应用程序之间的(跨应用)数据共享,提供读取和修改数据的统一接口。

什么时候使用ContentProvider

  • 允许其它应用访问或修改你的应用数据
  • AbstractThreadedSyncAdapter, CursorAdapter, CursorLoader依赖ContentProvider, 因此当你使用这些类时,就需要在你的应用中添加ContentProvider
  • 在应用中实现自定义搜索建议,SearchRecentSuggestionsProvider
  • 将应用数据公开到widgets
  • 将应用的数据或文件复制粘贴到其他应用

ContentResolver

ContentProvider提供了对数据层的封装,要实现增删改查我们可以使用ContentResolver对不同的ConentProvider进行操作。

  • Context类中的getContentResolver()方法获取ContentResolver对象。
  • ContentResolver类中的insert(),update(),delete(),query()方法实现增删改查操作

URI

ContetnResolver通过URI区分不同的ContentProvider以及表和表中的数据.

如URI:content://com.example.<appname>.provider/table/333分为四部分:

  • content://: 这部分是固定的,就像http://代表Http这个协议一样,使用ContentProvider的协议是content://
  • com.example.<appname>.provider: Authority,用以区别不同的ContentProvider
  • table: 表名,用以区分ContentProvider中不同的数据表
  • 333: id号,用以区别表中的不同数据

定义自己的ContentProvider

  • 创建自己的ArticlesProvider继承ContentProvider,并实现onCreate(), query(Uri, String[], String, String[], String),insert(Uri, ContentValues), update(Uri, ContentValues, String, String[]), delete(Uri, String, String[]), getType(Uri)方法.
  • MIME types
    • getType() & getStreamType() - Provider提供文件需要实现getStreamType()方法
    • MIME类型由两部分组成,前面是数据的大类别,后面定义具体的种类。ContentProvider中大类别根据同时访问的资源的数量分为两种,对于访问单个资源的URI,它的大类别就为vnd.android.cursor.item,而对于同时访问多个资源的URI,它的大类别就为vnd.android.cursor.dir;具体类别的格式一般为vnd.[company name].[resource type]
    • vnd.android.cursor.dir/vnd.com.example.provider.table1 - table1表的多行
    • vnd.android.cursor.item/vnd.com.example.provider.table1 - table1表的单行
  • 在AndroidManifest.xml中注册ContentProvider.

    • 1
      2
      3
      <provider    
      android:name="xxx.articles.provider.ArticlesProvider"
      android:authorities="xxx.articles.provider" />
  • 数据共享权限 https://developer.android.com/guide/topics/manifest/path-permission-element.html

    • android:exported 设置此provider是否可以被其他应用使用。
    • android:readPermission 该provider的读权限的标识
    • android:writePermission 该provider的写权限标识
    • android:permission provider读写权限标识
  • ContentProvider被其他应用查询

    • 声明Permission:

      <permission android:name="me.articles.READ" android:protectionLevel="normal"/>

    • 更改Provider:

      1
      2
      3
      4
      5
      6
      7
      8
      <provider
      android:name="xxx.articles.provider.ArticlesProvider"
      android:authorities="org.weyoung.articles.provider"
      android:label="@string/provider_label"
      android:multiprocess="false"
      android:readPermission="me.articles.READ"
      android:exported="true">
      </provider>
    • 其他应用总添加权限访问该Provider

      <uses-permission android:name="me.articles.READ" />