Android共享数据ContentProvider的使用
16lz
2021-01-24
本文转自:http://yaku2688.iteye.com/blog/1185364
ContentProvider数据共享
1.首先在AndroidManifest.xml文件中添加对外暴露的数据共享接口Content
Xml代码- <providerandroid:name=".UserProvider"android:authorities="com.yaku.ContentProvider.userprovider"/>
ContentProvider采用了authorities(主机名/域名)对它进行唯一标识,authorities 就是他的域名
2.Url解析
content://com.yaku.ContentProvider.userprovider/user/2
【content://】 Android定义的内容提供都的Schema
【com.yaku.ContentProvider.userprovider】 主机名或者authorities
【user】 路径
【2】 ID
示例代码:
数据结构User.java:
Java代码- packagecom.yaku.pojo;
- publicclassUser{
- privateintid;
- privateStringname;
- privateintage;
- publicUser(intid,Stringname,intage){
- super();
- this.id=id;
- this.name=name;
- this.age=age;
- }
- publicintgetId(){
- returnid;
- }
- publicvoidsetId(intid){
- this.id=id;
- }
- publicStringgetName(){
- returnname;
- }
- publicvoidsetName(Stringname){
- this.name=name;
- }
- publicintgetAge(){
- returnage;
- }
- publicvoidsetAge(intage){
- this.age=age;
- }
- @Override
- publicStringtoString(){
- return"User[age="+age+",id="+id+",name="+name+"]";
- }
- }
数据库操作DBOpenHelper.java:
Java代码- packagecom.yaku.db;
- importandroid.content.Context;
- importandroid.database.sqlite.SQLiteDatabase;
- importandroid.database.sqlite.SQLiteOpenHelper;
- publicclassDBOpenHelperextendsSQLiteOpenHelper{
- privatestaticfinalStringDBNAME="yaku.db";//数据库名称
- privatestaticfinalintDBVER=1;//数据库版本
- publicDBOpenHelper(Contextcontext){
- super(context,DBNAME,null,DBVER);
- }
- @Override
- publicvoidonCreate(SQLiteDatabasedb){
- Stringsql="CREATETABLEuser(useridintegerprimarykeyautoincrement,namevarchar(20),ageinteger)";
- db.execSQL(sql);//执行有更改的sql语句
- }
- @Override
- publicvoidonUpgrade(SQLiteDatabasedb,intarg1,intarg2){
- db.execSQL("DROPTABLEIFEXISTSuser");
- onCreate(db);
- }
- }
对外共享处理类ContentProviderUser.java:
Java代码
- packagecom.yaku.ContentProvider;
- importcom.yaku.db.DBOpenHelper;
- importandroid.content.ContentProvider;
- importandroid.content.ContentUris;
- importandroid.content.ContentValues;
- importandroid.content.UriMatcher;
- importandroid.database.Cursor;
- importandroid.database.sqlite.SQLiteDatabase;
- importandroid.net.Uri;
- publicclassContentProviderUserextendsContentProvider{
- privateDBOpenHelperdbOpenHelper;
- //常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
- privatestaticfinalUriMatcherMATCHER=newUriMatcher(UriMatcher.NO_MATCH);
- privatestaticfinalintUSERS=1;
- privatestaticfinalintUSER=2;
- static{
- //如果match()方法匹配content://com.yaku.ContentProvider.userprovider/user路径,返回匹配码为1
- MATCHER.addURI("com.yaku.ContentProvider.userprovider","user",USERS);
- //如果match()方法匹配content://com.yaku.ContentProvider.userprovider/user/123路径,返回匹配码为2
- MATCHER.addURI("com.yaku.ContentProvider.userprovider","user/#",USER);//#号为通配符
- }
- @Override
- publicintdelete(Uriuri,Stringselection,String[]selectionArgs){
- SQLiteDatabasedb=dbOpenHelper.getWritableDatabase();
- intcount=0;
- switch(MATCHER.match(uri)){
- caseUSERS:
- count=db.delete("user",selection,selectionArgs);
- returncount;
- caseUSER:
- //ContentUris类用于获取Uri路径后面的ID部分
- longid=ContentUris.parseId(uri);
- Stringwhere="userid="+id;
- if(selection!=null&&!"".equals(selection)){
- where=selection+"and"+where;
- }
- count=db.delete("user",where,selectionArgs);
- returncount;
- default:
- thrownewIllegalArgumentException("UnkwonUri:"+uri.toString());
- }
- }
- /**
- *该方法用于返回当前Url所代表数据的MIME类型。
- *如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头
- *如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头
- */
- @Override
- publicStringgetType(Uriuri){
- switch(MATCHER.match(uri)){
- caseUSERS:
- return"vnd.android.cursor.dir/user";
- caseUSER:
- return"vnd.android.cursor.item/user";
- default:
- thrownewIllegalArgumentException("UnkwonUri:"+uri.toString());
- }
- }
- @Override
- publicUriinsert(Uriuri,ContentValuesvalues){
- SQLiteDatabasedb=dbOpenHelper.getWritableDatabase();
- switch(MATCHER.match(uri)){
- caseUSERS:
- longrowid=db.insert("user","name",values);
- UriinsertUri=ContentUris.withAppendedId(uri,rowid);//得到代表新增记录的Uri
- this.getContext().getContentResolver().notifyChange(uri,null);
- returninsertUri;
- default:
- thrownewIllegalArgumentException("UnkwonUri:"+uri.toString());
- }
- }
- @Override
- publicbooleanonCreate(){
- this.dbOpenHelper=newDBOpenHelper(this.getContext());
- returnfalse;
- }
- @Override
- publicCursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,
- StringsortOrder){
- SQLiteDatabasedb=dbOpenHelper.getReadableDatabase();
- switch(MATCHER.match(uri)){
- caseUSERS:
- returndb.query("user",projection,selection,selectionArgs,null,null,sortOrder);
- caseUSER:
- longid=ContentUris.parseId(uri);
- Stringwhere="userid="+id;
- if(selection!=null&&!"".equals(selection)){
- where=selection+"and"+where;
- }
- returndb.query("user",projection,where,selectionArgs,null,null,sortOrder);
- default:
- thrownewIllegalArgumentException("UnkwonUri:"+uri.toString());
- }
- }
- @Override
- publicintupdate(Uriuri,ContentValuesvalues,Stringselection,String[]selectionArgs){
- SQLiteDatabasedb=dbOpenHelper.getWritableDatabase();
- intcount=0;
- switch(MATCHER.match(uri)){
- caseUSERS:
- count=db.update("person",values,selection,selectionArgs);
- returncount;
- caseUSER:
- longid=ContentUris.parseId(uri);
- Stringwhere="userid="+id;
- if(selection!=null&&!"".equals(selection)){
- where=selection+"and"+where;
- }
- count=db.update("user",values,where,selectionArgs);
- returncount;
- default:
- thrownewIllegalArgumentException("UnkwonUri:"+uri.toString());
- }
- }
- }
单元测试类(在另一个应用中):
Java代码- packagecom.yaku.ContentProvider;
- importandroid.content.ContentResolver;
- importandroid.content.ContentValues;
- importandroid.database.Cursor;
- importandroid.net.Uri;
- importandroid.test.AndroidTestCase;
- importandroid.util.Log;
- /**
- *对ContentProvider工程中的ContentProviderActivity进行单元测试
- */
- publicclassContentProviderActivityTestextendsAndroidTestCase{
- privatestaticfinalStringTAG="ContentProvider";
- //往内容提供者添加数据
- publicvoidtestInsert()throwsThrowable{
- ContentResolvercontentResolver=this.getContext().getContentResolver();
- UriinsertUri=Uri.parse("content://com.yaku.ContentProvider.userprovider/user");
- ContentValuesvalues=newContentValues();
- values.put("name","道长");
- values.put("age",86);
- Uriuri=contentResolver.insert(insertUri,values);
- Log.i(TAG,uri.toString());
- }
- //更新内容提供者中的数据
- publicvoidtestUpdate()throwsThrowable{
- ContentResolvercontentResolver=this.getContext().getContentResolver();
- UriupdateUri=Uri.parse("content://com.yaku.ContentProvider.userprovider/user/1");
- ContentValuesvalues=newContentValues();
- values.put("name","青眉道长");
- contentResolver.update(updateUri,values,null,null);
- }
- //从内容提供者中删除数据
- publicvoidtestDelete()throwsThrowable{
- ContentResolvercontentResolver=this.getContext().getContentResolver();
- UrideleteUri=Uri.parse("content://com.yaku.ContentProvider.userprovider/user/1");
- contentResolver.delete(deleteUri,null,null);
- }
- //获取内容提供者中的数据
- publicvoidtestFind()throwsThrowable{
- ContentResolvercontentResolver=this.getContext().getContentResolver();
- UriselectUri=Uri.parse("content://com.yaku.ContentProvider.userprovider/user");
- Cursorcursor=contentResolver.query(selectUri,null,null,null,"useriddesc");
- while(cursor.moveToNext()){
- intid=cursor.getInt(cursor.getColumnIndex("userid"));
- Stringname=cursor.getString(cursor.getColumnIndex("name"));
- intage=cursor.getInt(cursor.getColumnIndex("age"));
- Log.i(TAG,"id="+id+",name="+name+",age="+age);
- }
- }
- }
监听数据的变化:
Java代码- <SPANstyle="FONT-SIZE:medium">packagecom.yaku.ContentProvider;
- importandroid.content.ContentResolver;
- importandroid.content.ContentValues;
- importandroid.database.Cursor;
- importandroid.net.Uri;
- importandroid.test.AndroidTestCase;
- importandroid.util.Log;
- /**
- *监听数据变化
- */
- publicclassOtherContentProviderTestextendsAndroidTestCase{
- privatestaticfinalStringTAG="OtherContentProvider";
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- UriinsertUri=Uri.parse("content://com.yaku.ContentProvider.userprovider/user");
- ContentResolvercontentResolver=this.getContentResolver();
- //对指定uri进行监听,如果该uri代表的数据发生变化,就会调用PersonObserver中的onChange()
- contentResolver.registerContentObserver(insertUri,true,newPersonObserver(newHandler()));
- }
- privatefinalclassPersonObserverextendsContentObserver{
- publicPersonObserver(Handlerhandler){
- super(handler);
- }
- @Override
- publicvoidonChange(booleanselfChange){
- ContentResolvercontentResolver=getContentResolver();
- UriselectUri=Uri.parse("content://com.yaku.ContentProvider.userprovider/user");
- Cursorcursor=contentResolver.query(selectUri,null,null,null,"useriddesc");
- while(cursor.moveToNext()){
- intid=cursor.getInt(cursor.getColumnIndex("userid"));
- Stringname=cursor.getString(cursor.getColumnIndex("name"));
- intage=cursor.getInt(cursor.getColumnIndex("age"));
- Log.i(TAG,"id="+id+",name="+name+",age="+age);
- }
- }
- }
- }
- </SPAN>
更多相关文章
- Android引入签名文件
- android模拟器设置代理上网
- 启动emulator出错
- Android(安卓)Sqlite 相关汇总
- Android(安卓)binder 原理及实现机制
- Android(安卓)Intent
- Android(安卓)Intent调用大全
- 【置顶】Errors occurred during the build完美解决之道
- Spinner 使用方法小结