当前位置: 代码迷 >> 综合 >> Android开发学习之四大组件之一 --- ContentProvider
  详细解决方案

Android开发学习之四大组件之一 --- ContentProvider

热度:51   发布时间:2024-01-09 06:54:08.0

                                      Android开发学习之四大组件之一 --- ContentProvider


ContentProvider简介

      在Android中,每一个应用程序都是采用私有的形式进行操作的,不管这些数据是用文件还是数据库保存,都不能被外部应用程序所访问。但是在很多情况下,用户需要可以在不同的应用之间进行数据交换,为了解决这个问题,在Android中专门提供了一个ContentProvider类,此类的 主要功能是将不同的应用程序的操作标准统一起来,并且将各个应用程序的数据操作标准表明给其他的应用程序,这样,一个应用程序中的数据就可以按照ContentProvider所制定的标准被外部所操作

        提示:ContentProvider的主要作用是在不同的应用程序之间进行数据交换,这类似于Web Services技术

           简单地说:

  1.         ContentProvider将应用中的数据对其它应用进行共享, 提供增删改查的方法  
  2.         ContentProvider统一了数据的访问方式,不必针对不同数据类型采取不同的访问策略  
  3.         ContentProvider将数据封装,只暴露出我们希望提供给其它程序的数据  
  4.         ContentProvider中可以注册观察者, 监听数据的变化

如何使用
  1. 定义类继承ContentProvider, 实现抽象方法  
  2. 在清单文件中注册:在清单文件的<application>节点下进行配置<provider>标签,标签中需要指定name和authorities属性                                          name:完整的类名。可以省略包名(manifest节点的package值),                         注意:省略后的类名是以"."开头的。(类名首字母大写别忘了)                           authorities:是访问Provider时的路径,要唯一 uri的一部分
  【 使用前提

    将应用安装在手机上即可,不用运行程序即即可让其他程序操作


   其他应用访问方式

  1.  外部应用使用ContentResolver类对ContentProvider中的数据进行访问(CRUD操作)  
  2. 获取解析器ContentResolver                                                    ContentResolver resolver = Context.getContentResolver();                                                                                 通过resolver.insert(), delete(), update(), query()方法访问Uri关联的ContentProvider 
   【URI
  1.         URI代表要操作的数据,由scheme、authorites、path三部分组成                                                                          eg:                                                                                                                                                                                                                content://com.jxn.provider/person/3                                                                                    scheme   |     authorites     | path  
  2.        schema:ContentProvider(内容提供者)访问协议,固定为:"content://"  
  3.        Authority(主机名或授权):定义了是哪个ContentProvider提供这些数据。 用于唯一标识ContentProvider,外  部调用者可以根据该标识来找到它,一般都为程序的“包.类”名称,但是要采用小写字母的形式
  4.        path:访问的路径,一般为要操作的数据表的名称,根据操作的不同一般可以分为如下几况                                 ①访问全部数据:content://Authority/path.                                                                                                              例如,访问member表的全部数据: content://org.lxh.demo.membercontentprovider/member/                           ②根据ID访问数据:content://Authority/path/ID                                                                                                        例如:访问member表中ID为3的数据:content://org.lxh.demo.membercontentprovider/member/3                        ③访问某一条记录的某个字段:content://访问标识/表名称 /ID/列名称                                                                      例如:访问member表第3条记录name字段中的数据:                                                                                    content://org.lxh.demo.membercontentprovider/member/3/name                                                                                                                                                               

         Android系统提供了两个用于操作Uri的工具类:UriMatcher 和 ContentUris

  UriMatcher

  1.  第一步:把你需要匹配的Uri路径全部给注册上,如下:         
  2.                 //常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码  
  3.                 UriMatcher  matcher = new UriMatcher(UriMatcher.NO_MATCH);  
  4.                 //如果match()方法匹配content://com.jxn.provider.personprovider/person路径,返回匹配码为1  
  5.                 matcher.addURI("com.jxn.provider.personprovider", "person", 1);//添加需要匹配uri,如果匹配就会返回匹配码  
  6.                 //如果match()方法匹配content://com.jxn.provider.personprovider/person/230路径,返回匹配码为2  
  7.                 matcher.addURI("com.jxn.provider.personprovider", "person/#", 2);//#号为通配符  
  8.               
  9.             第二步:使用matcher.match(uri)方法对输入的Uri进行匹配,如果匹配成功就返回匹配码  
  10.                 switch (matcher.match(Uri.parse("content://com.jxn.provider.personprovider/person/10"))) {   
  11.                     case 1  
  12.                         // 相应的业务操作  
  13.                         break;  
  14.                     case 2  
  15.                         // 相应的业务操作  
  16.                         break;  
  17.                     default:  
  18.                         // 相应的业务操作  
  19.                         break;  
  20.                 } 

  ContentUris】   

  1. 给Uri加上id:   ContentUris.withAppendedId(uri, id)   
  2.         获取id:       ContentUris.parseId(uri)
  

 【监听内容提供者数据变化

  

  1. 如果ContentProvider的访问者需要知道ContentProvider中的数据发生了变化,可以在ContentProvider 发生数据变化时调用getContentResolver().notifyChange(uri, null)来通知注册在此URI上的访问者,例如:  
  2.             public class PersonContentProvider extends ContentProvider {  
  3.                 public Uri insert(Uri uri, ContentValues values) {  
  4.                     db.insert("person", "personid", values);  
  5.                     // 注:如果没有调用notifyChange()方法,即使其它应用注册了ContentObserver,也不会知道ContentProvider中的数据的变化  
  6.                     getContext().getContentResolver().notifyChange(uri, null);  
  7.                 }  
  8.             }  
  9.               
  10.         2,如果ContentProvider的访问者需要得到数据变化通知,必须使用ContentObserver对数据(用uri描述)进行监听,当监听到数据变化通知时,系统就会调用ContentObserver的onChange()方法:  
  11.             getContentResolver().registerContentObserver(Uri.parse("content://com.jxn.providers.personprovider/person"),true, new PersonObserver(new Handler()));  
  12.             public class PersonObserver extends ContentObserver{  
  13.                 public PersonObserver(Handler handler) {  
  14.                     super(handler);  
  15.                 }  
  16.                 public void onChange(boolean selfChange) {  
  17.                     //此处可以进行相应的业务处理  
  18.                 }  
  19.             } 
  【 返回uri的 MIME类型
  1. getType()方法:主要用于匹配数据类型,返回当前Uri所代表数据的MIME类型。  
  2.             如果返回数据是单条数据:vnd.android.cursor.item   
  3.             如果返回数据是多条数据:vnd.android.cursor.dir
  【 案例分享

   






  相关解决方案