内容提供者

来源:互联网 发布:阿里云 实名验证 编辑:程序博客网 时间:2024/04/25 19:25

@使用ContentProvider共享数据
    当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。
    虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外
    共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数据,需要使用sharedpreferences
    API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。
    当应用需要通过ContentProvider对外共享数据时,
    第一步需要继承ContentProvider并重写下面方法:
        public class PersonContentProvider extends ContentProvider{
           public boolean onCreate()
           public Uri insert(Uri uri, ContentValues values)
           public int delete(Uri uri, String selection, String[] selectionArgs)
           public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
           public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
            String sortOrder)
       public String getType(Uri uri)}
    第二步需要在AndroidManifest.xml使用<provider>对该ContentProvider进行配置,为了能让其他应用找到该
        ContentProvider , ContentProvider 采用了authorities(主机名/域名)对它进行唯一标识,你可以把
        ContentProvider看作是一个网站(想想,网站也是提供数据者),authorities 就是他的域名:
            <manifest .... >
                <application android:icon="@drawable/icon" android:label="@string/app_name">
               
               
                    <provider android:name=".PersonContentProvider"
                    android:authorities="cn.itcast.provider.personprovider"/>
                   
                   
                </application>
            </manifest>
    注意:一旦应用继承了ContentProvider类,后面我们就会把这个应用称为ContentProvider(内容提供者)。
@Uri 是什么
    Uri代表了要操作的数据,Uri主要包含了两部分信息:1》需要操作的ContentProvider ,2》对ContentProvider
    中的什么数据进行操作,一个Uri由以下几部分组成:
   
    content://cn.itcast.provider.personprovider/person/10
    |      |  |                                |      |   |
    |      |  |                                |      |   |
    |______|  |________________________________|______|___|      
    scheme(固定)        主机名称(唯一性)               |路径        ID
                                               |开发
                                               |人员
                                               |定义
   
    ContentProvider(内容提供者)的scheme已经由Android所规定, scheme为:content://
    主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
    路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:
        要操作person表中id为10的记录,可以构建这样的路径:/person/10
        要操作person表中id为10的记录的name字段, person/10/name
        要操作person表中的所有记录,可以构建这样的路径:/person
        要操作xxx表中的记录,可以构建这样的路径:/xxx
    当然要操作的数据不一定来自数据库,也可以是文件、xml或网络等他存储方式,如下:
        要操作xml文件中person节点下的name节点,可以构建这样的路径:/person/name
    如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:
        Uri uri = Uri.parse("content://cn.itcast.provider.personprovider/person")

@UriMatcher类使用介绍

    因为Uri代表了要操作的数据,所以我们经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个
    用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。掌握它们的使用,会便于我们的开发工作。
    UriMatcher类用于匹配Uri,它的用法如下:
    首先第一步把你需要匹配Uri路径全部给注册上,如下:
    //常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
    UriMatcher  sMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    //如果match()方法匹配content://cn.itcast.provider.personprovider/person路径,返回匹配码为1
    sMatcher.addURI(“cn.itcast.provider.personprovider”, “person”, 1);//添加需要匹配uri,如果
    匹配就会返回匹配码
    //如果match()方法匹配content://cn.itcast.provider.personprovider/person/230路径,返回匹配
    码为2
    sMatcher.addURI(“cn.itcast.provider.personprovider”, “person/#”, 2);//#号为通配符
    switch (sMatcher.match(Uri.parse("content://cn.itcast.provider.personprovider/person/10"))) {
       case 1
        break;
       case 2
        break;
       default://不匹配
        break;
    }
    注册完需要匹配的Uri后,就可以使用sMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,
    匹配码是调用addURI()方法传入的第三个参数,假设匹配content://cn.itcast.provider.personprovider/person路径,
    返回的匹配码为1

原创粉丝点击