数据方法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 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 就是他的域名:
<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 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 resultUri = ContentUris.withAppendedId(uri, 10);
//生成后的Uri为:content://com.ljq.provider.personprovider/person/10
parseId(uri)方法用于从路径中获得ID部份:
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中的数据停止添加、删除、修改和查询操纵:
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, null, null, null, "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, null, null);
//删除id为2的录记
Uri deleteIdUri = ContentUris.withAppendedId(uri, 2);
resolver.delete(deleteIdUri, null, null);
七、听监ContentProvider中数据的变更
如果ContentProvider的问访者须要晓得ContentProvider中的数据生发变更,可以在ContentProvider生发数据变更时用调getContentResolver().notifyChange(uri, null)来通知册注在此URI上的问访者,例子如下:
public Uri insert(Uri uri, ContentValues values) {
db.insert("person", "personid", values);
getContext().getContentResolver().notifyChange(uri, null);
}
}
如果ContentProvider的问访者须要到得数据变更通知,必须用使ContentObserver对数据(数据用采uri述描)停止听监,当听监到数据变更通知时,统系就会用调ContentObserver的onChange()方法:
true, new 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、不怕病毒,但是很害怕自己的程序;