一、ContentProvider的概念

  ContentProvider:为存储和获取数据提供统一的接口。可以在不同的应用程序之间共享数据并能够保证隐私数据的安全性。

Android已经为常见的一些数据(比如:联系人信息)提供了默认的ContentProvider。


  1、ContentProvider使用表的形式来组织数据


   无论数据的来源是什么,ContentProvider都会认为是一种表,然后把数据组织成表格


  2、ContentProvider提供的方法(自定义一个继承自ContentProvider 的类时必须同时实现以下六个函数)


   query:查询


   insert:插入


   update:更新


   delete:删除


   getType:得到数据类型


   onCreate:初始化内容提供器的时候调用,完成数据库的创建或升级等操作(注意:只有当存在ContentResolver尝试访问我们程序中的数据时,内容提供器才会被初始化。)


  3、每个ContentProvider都至少有一个公共的URI,此URI用于表示这个ContentProvider所提供的数据。Android所提供的ContentProvider都存放在android.provider包当中。

权限和路径写法如下:

content://com.example.app.provider/table1(/id1)

        即: 权限一般用包名加provider构成

路径就是表名或者表名加表中某列的id值

                最后在头部添加一个协议声明content://

当然,也可以在URI中使用通配符。比如:*表示匹配任意长度的任意字符

#表示匹配任意长度的数字 

content://com.example.app.provider/table1/#表示匹配table1表中的任意一行数据的内容URI

二、ContentProvider的使用

    1、   自定义一个类继承自ContentProvider,并实现上述的六个方法。

    2、 借助UriMatcher这个类来实现内容Uri的匹配

              定义整型变量以便使用UriMacther类的addURI方法将URI与定义的整型变量绑定。



三、使用ContentResolver访问其他程序提供的数据

1、通过Context的getContentResolver()方法获得ContentResolver的实例。

2、ContentResolver也有对应的insert()  、update() 、  delete() 、  query()四个方法。各个方法需要的参数不同,但都需要一个URI参数来指定要访问的数据的权限和位置。而且查询方法获得的信息也是一个Cursor对象。

获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。掌握它们的使用,会便于我们的开发工作。
       UriMatcher:用于匹配Uri,它的用法如下:
       1.首先把你需要匹配Uri路径全部给注册上,如下:
       //常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码(-1)。
       UriMatcher  uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
       //如果match()方法匹配content://com.changcheng.sqlite.provider.contactprovider/contact路径,返回匹配码为1
       uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact”, 1);//添加需要匹配uri,如果匹配就会返回匹配码
       //如果match()方法匹配   content://com.changcheng.sqlite.provider.contactprovider/contact/230路径,返回匹配码为2
       uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact/#”, 2);//#号为通配符
      
       2.注册完需要匹配的Uri后,就可以使用uriMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用addURI()方法传入的第三个参数,假设匹配content://com.changcheng.sqlite.provider.contactprovider/contact路径,返回的匹配码为1。

       ContentUris:用于获取Uri路径后面的ID部分,它有两个比较实用的方法:
•         withAppendedId(uri, id)用于为路径加上ID部分
•         parseId(uri)方法用于从路径中获取ID部分



四、需要注意的信息:

1、要使用ContentProvider需要先在配置文件中进行注册。

例如:<provider android:name="MyProvider" android:authorities="com.ruixin.login" />

2、使用ContentProvider来向外界提供数据能很好的保证隐私数据的安全。因为,我们不会把隐私数据URI添加到UriMatcher中。其他应用也就无法通过URI匹配到这些数据信息。