ContentProvider

来源:互联网 发布:网络社会零售额 编辑:程序博客网 时间:2024/06/03 21:54
ContentProvider是实现不同程序中的数据共享.
1.在被共享的工程文件中需要定义一个类来暴露自己的数据.该类继承ContentProvider.
2.定义完该类后需要在Manifest.xml文件中配置(四大组件使用前都需要配置)
   配置需要两个属性.name就是定义的那个类名.authorities是个Uri.(提供给人家访问的路径).
   定义Uri一般是写包名+类名.如:cn.itcast.db.personprovider
   别人访问的时候要输入:content://cn.itcast.db.personprovider
   如果是输入:content://cn.itcast.db.personprovider/person  则表示要访问person这张表
   如果是输入:content://cn.itcast.db.personprovider/person/10 则表示要访问person表中ID为10的数据
3.实现类中的方法
   1.首先定义一个Uri的匹配器
     private static final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);该参数是int类型的.-1.意思是当匹配不到的时候返回这个值.
     初始化这个匹配器
     static{
    matcher.addURI("cn.itcast.db.personprovider","person",1);
    第一个参数是在Manifest.xml中定义的Uri.
    第二个参数是要访问的数据库中的一张表名.
    第三个参数是一个int型的整数.表示匹配到正确的Uri返回这个值.一般不直接填值而是声明一个final的局部变量.
   }
  
   2.实现增删改查的方法
     用switch(matcher.matcher(uri))语句判断.
     如果Uri符合的话执行增删改查.不符合的话执行throw new IllegalArgumentException("Uri不能被识别");
     匹配器有个帮助类ContentUris.
     在插入时用ContentUris.withAppendedId(uri,id);把修改后的地址返回.
     在查询时有两种情况.一是查询整个数据库.二是查询某一条数据.
       需要再定义一个状态码
       private static final int PERSONS=2;
       然后在静态代码块中添加
       matcher.addURI("cn.itcast.db.personprovider","person/#",PERSONS);
       "person/#"中的#号代表任意数字.
    还要使用ContentUris.parseId(uri);来过滤出来Uri中的最后一个数字.
   3.实现onCreate()该方法在ContentProvider创建后就会被调用
      Android开机后,ContentProvider在其它应用第一次访问它时才会被创建。
   4.实现getType(Uri uri)该方法用于返回当前Url所代表数据的MIME类型。
      如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头
          例如:要得到所有person记录的Uri为content://cn.itcast.provider.personprovider/person
                那么返回的MIME类型字符串应该为:“vnd.android.cursor.dir/person”。
      如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头
          例如:得到id为10的person记录,Uri为content://cn.itcast.provider.personprovider/person/10
                那么返回的MIME类型字符串应该为:“vnd.android.cursor.item/person”。

4.定义测试工程.
   1.定义测试类继承AndroidTestCase
   2.在类中通过上下文取得resolver
     ContentProvider是把一个数据暴露出去.
     ContentResolver是取得一个暴露的数据.
     例如:
     ContentResolver resolver = getContext().getContentResolver();
     Uri uri = Uri.parse("content://cn.itcast.db.personprovider/person");
   //Uri.parse是把一个字符串转换成Uri
     ContentValuse values = new ContentValuse();
     values.put("name","zhansan");
     values.put("phone","10086");
     valuse.put("account","1000");
     resolver.insert(uri,values); 
   3.测试时先把被共享的那个工程部署到手机.然后再测试.

ContentProvider的好处:
1.可以在不同的应用程序中共享数据
2.ContentProvider封装数据访问的细节.
    操作文件,操作sharedpreferpence,访问网络
3.ContentProvider提供了观察数据发生改变的能力

ContentProvider观察者:他能察觉到某个ContentProvider(被共享者)的数据是否发生了改变.
ContentProvider一旦发生了改变观察者就会向周围发散信息.凡是注册了观察者的应用都可以收到信息.
1.首先在A应用(ContentProvider)中注册观察者来观察A应用是否发生了改变.
    Uri changeUri = Uri.parse("Content://cn.itcast.db.personprovider/person");
    getContext().getContentResolver().notifyChange(changeUri,null);第二个参数是明确观察者.这里为null是手动添加一个观察者.
2.然后建立B应用对A应用操作改变A应用.
3.建立C应用,注册观察者来通过A观察者发的信息来观察A应用的改变.
   1.Uri changeUri = Uri.parse("Content://cn.itcast.db.personprovider/person");
   2.this.getContentResolver().registerContentObserver(changeUri,true,new PersonObserver(new handler));
        第一个参数是要监听的Uri.
第二个参数是true的话则Uri/#任何数据发生改变都能接到通知.false的话则只有Uri的数据发生改变才能接到通知
第三个参数是一个观察者
4.创建一个观察者
    定义一个类继承ContentObserver,实现构造函数和OnChange()方法.在OnChange()方法中可以定义一些操作或者打印.

5.测试
    先把C应用和A应用都部署到手机上.然后运行B应用去改变A应用的数据.
6.应用场景
    监听用户的短信.(需要读写短信的权限).当用户发送和接收短信时可以获取到用户的短信的内容和地址.然后转发给另一个人或者传到网络服务器.
原创粉丝点击