• 数据方法Android 中ContentProvider和Uri详解


    每日一贴,今天的内容关键字为数据方法

        一、用使ContentProvider(内容供给者)享共数据

        ContentProvider在android中的用作是对外享共数据,也就是说你可以通过ContentProvider把用应中的数据享共给其他用应问访,其他用应可以通过ContentProvider对你用应中的数据停止添改删查。关于数据享共,之前我们习学过件文操纵模式,晓得通过指定件文的操纵模式为Context.MODE_WORLD_READABLE或Context.MODE_WORLD_WRITEABLE一样也可以对外享共数据。那么,这里为何要用使ContentProvider对外享共数据呢?是这样的,如果用采件文操纵模式对外享共数据,数据的问访方法会因数据存储的方法而不同,致导数据的问访方法法无一统,如:用采xml件文对外享共数据,须要停止xml剖析才能取读数据;用采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
    ="com.ljq.providers.personprovider"/>
    </application>
    </manifest>

                  

                     

        二、Uri绍介

        Uri代表了要操纵的数据,Uri重要包含了两部份信息:1》须要操纵的ContentProvider ,2》对ContentProvider中的什么数据停止操纵,一个Uri由以下几部份构成:     

        数据和方法

        每日一道理
    灯,带有一种明亮的光,每当深夜来临,是它陪伴着你,如此默默无闻。它是平凡的,外表华丽与否,那都是一样的,珍珠点缀,水晶加饰的灯它只能用以装饰,来满足人们的虚荣心,比起这,普普通通的日光灯是幸运的,因为它照明的本性没有改变,如同生活中的一部份人平平凡凡却实实在在。

        

    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://com.ljq.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://com.ljq.provider.personprovider/person路径,返回配匹码为1
    sMatcher.addURI("com.ljq.provider.personprovider""person"1);//添加须要配匹uri,如果配匹就会返回配匹码
    //如果match()方法配匹content://com.ljq.provider.personprovider/person/230路径,返回配匹码为2
    sMatcher.addURI("com.ljq.provider.personprovider""person/#"2);//#号为通配符
    switch (sMatcher.match(Uri.parse("content://com.ljq.provider.personprovider/person/10"))) { 
    case 1
    break;
    case 2
    break;
    default://不配匹
    break;
    }
    数据和方法

    册注完须要配匹的Uri后,就能够用使sMatcher.match(uri)方法对入输的Uri停止配匹,如果配匹就返回配匹码,配匹码是用调addURI()方法传入的第三个参数,设假配匹content://com.ljq.provider.personprovider/person路径,返回的配匹码为1 

                  

                     

    四、ContentUris类用使绍介

    ContentUris类用于操纵Uri路径前面的ID部份,它有两个比拟用实的方法:
    withAppendedId(uri, id)用于为路径加上ID部份:

    Uri uri = Uri.parse("content://com.ljq.provider.personprovider/person")
    Uri resultUri 
    = ContentUris.withAppendedId(uri, 10); 
    //生成后的Uri为:content://com.ljq.provider.personprovider/person/10

    parseId(uri)方法用于从路径中获得ID部份:

    Uri uri = Uri.parse("content://com.ljq.provider.personprovider/person/10")
    long personid = ContentUris.parseId(uri);//获得的结果为:10

              

                  

    五、用使ContentProvider享共数据

    ContentProvider类重要方法的用作:
    public boolean onCreate():该方法在ContentProvider建创后就会被用调,Android开机后,ContentProvider在其它用应第一次问访它时才会被建创。
    public Uri insert(Uri uri, ContentValues values):该方法用于供外部用应往ContentProvider添加数据。
    public int delete(Uri uri, String selection, String[] selectionArgs):该方法用于供外部用应从ContentProvider删除数据。
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs):该方法用于供外部用应更新ContentProvider中的数据。
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder):该方法用于供外部用应从ContentProvider中获得数据。
    public String getType(Uri uri):该方法用于返回前当Url所代表数据的MIME类型。

    如果操纵的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/头开,

    例如:要到得有所person录记的Uri为content://com.ljq.provider.personprovider/person,那么返回的MIME类型字符串应该为:"vnd.android.cursor.dir/person"。

    如果要操纵的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/头开,

    例如:到得id为10的person录记,Uri为content://com.ljq.provider.personprovider/person/10,那么返回的MIME类型字符串为:"vnd.android.cursor.item/person"。

                  

                    

    六、用使ContentResolver操纵ContentProvider中的数据

    当外部用应须要对ContentProvider中的数据停止添加、删除、修改和查询操纵时,可以用使ContentResolver 类来实现,要获得ContentResolver 对象,可以用使Activity供给的getContentResolver()方法。 ContentResolver 类供给了与ContentProvider类同相签名的四个方法:
    public Uri insert(Uri uri, ContentValues values):该方法用于往ContentProvider添加数据。
    public int delete(Uri uri, String selection, String[] selectionArgs):该方法用于从ContentProvider删除数据。
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs):该方法用于更新ContentProvider中的数据。
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder):该方法用于从ContentProvider中获得数据。

    这些方法的第一个参数为Uri,代表要操纵的ContentProvider和对其中的什么数据停止操纵,

    设假给定的是:Uri.parse("content://com.ljq.providers.personprovider/person/10"),那么将会对主机名为com.ljq.providers.personprovider的ContentProvider停止操纵,操纵的数据为person表中id为10的录记。

    用使ContentResolver对ContentProvider中的数据停止添加、删除、修改和查询操纵:

    数据和方法
    ContentResolver resolver = getContentResolver();
    Uri uri 
    = Uri.parse("content://com.ljq.provider.personprovider/person");
    //添加一条录记
    ContentValues values = new ContentValues();
    values.put(
    "name""linjiqin");
    values.put(
    "age"25);
    resolver.insert(uri, values); 
    //获得person表中有所录记
    Cursor cursor = resolver.query(uri, nullnullnull"personid desc");
    while(cursor.moveToNext()){
    Log.i(
    "ContentTest""personid="+ cursor.getInt(0)+ ",name="+ cursor.getString(1));
    }
    //把id为1的录记的name字值段变动新为zhangsan
    ContentValues updateValues = new ContentValues();
    updateValues.put(
    "name""zhangsan");
    Uri updateIdUri 
    = ContentUris.withAppendedId(uri, 2);
    resolver.update(updateIdUri, updateValues, 
    nullnull);
    //删除id为2的录记
    Uri deleteIdUri = ContentUris.withAppendedId(uri, 2);
    resolver.delete(deleteIdUri, 
    nullnull);
    数据和方法

                

                   

    七、听监ContentProvider中数据的变更

    如果ContentProvider的问访者须要晓得ContentProvider中的数据生发变更,可以在ContentProvider生发数据变更时用调getContentResolver().notifyChange(uri, null)来通知册注在此URI上的问访者,例子如下:

    public class PersonContentProvider extends ContentProvider {
    public Uri insert(Uri uri, ContentValues values) {
    db.insert(
    "person""personid", values);
    getContext().getContentResolver().notifyChange(uri, 
    null);
    }
    }

    如果ContentProvider的问访者须要到得数据变更通知,必须用使ContentObserver对数据(数据用采uri述描)停止听监,当听监到数据变更通知时,统系就会用调ContentObserver的onChange()方法:

    数据和方法
    getContentResolver().registerContentObserver(Uri.parse("content://com.ljq.providers.personprovider/person"),
    truenew PersonObserver(new Handler()));
    public class PersonObserver extends ContentObserver{
    public PersonObserver(Handler handler) {
    super(handler);
    }
    public void onChange(boolean selfChange) {
    //此处可以停止响应的务业处理
    }
    }

    数据和方法

    文章结束给大家分享下程序员的一些笑话语录: 系统程序员
      1、头皮经常发麻,在看见一个蓝色屏幕的时候比较明显,在屏幕上什幺都看不见的时候尤其明显;
      2、乘电梯的时候总担心死机,并且在墙上找reset键;
      3、指甲特别长,因为按F7到F12比较省力;
      4、只要手里有东西,就不停地按,以为是Alt-F、S;
      5、机箱从来不上盖子,以便判断硬盘是否在转;
      6、经常莫名其妙地跟踪别人,手里不停按F10;
      7、所有的接口都插上了硬盘,因此觉得26个字母不够;
      8、一有空就念叨“下辈子不做程序员了”;
      9、总是觉得9号以后是a号;
      10、不怕病毒,但是很害怕自己的程序;

  • 相关阅读:
    CentOS 7 安装java 环境
    CentOS 7 替换网易yum 源
    九度:题目1553:时钟
    Maximum Subarray
    职场细节
    poj2524 Ubiquitous Religions
    九度 1526:朋友圈
    程序载入
    设备管理
    操作系统系列
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3067633.html
Copyright © 2020-2023  润新知