数据方法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、不怕病毒,但是很害怕自己的程序;

posted @ 2013-05-08 20:07  xinyuyuanm  阅读(373)  评论(0编辑  收藏  举报