100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Android共享数据ContentProvider的使用

Android共享数据ContentProvider的使用

时间:2021-04-14 14:58:11

相关推荐

Android共享数据ContentProvider的使用

本文来自:/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; .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; .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; .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>

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。