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

[转]Android共享数据ContentProvider的使用

时间:2023-05-29 14:44:22

相关推荐

[转]Android共享数据ContentProvider的使用

本文转自:/blog/1185364

ContentProvider数据共享

1.首先在AndroidManifest.xml文件中添加对外暴露的数据共享接口Content

Xml代码<providerandroid:name=".UserProvider"android:authorities="com.yaku.ContentProvider.userprovider"/>

<provider android: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; } @OverridepublicStringtoString(){ return"User[age="+age+",id="+id+",name="+name+"]"; } }

package com.yaku.pojo;public class User {private int id;private String name;private int age;public User(int id, String name, int age) {super();this.id = id;this.name = name;this.age = age;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {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); } @OverridepublicvoidonCreate(SQLiteDatabasedb){ Stringsql="CREATETABLEuser(useridintegerprimarykeyautoincrement,namevarchar(20),ageinteger)"; db.execSQL(sql);//执行有更改的sql语句 } @OverridepublicvoidonUpgrade(SQLiteDatabasedb,intarg1,intarg2){ db.execSQL("DROPTABLEIFEXISTSuser"); onCreate(db); } }

package com.yaku.db;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class DBOpenHelper extends SQLiteOpenHelper {private static final String DBNAME = "yaku.db"; //数据库名称private static final int DBVER = 1;//数据库版本public DBOpenHelper(Context context) {super(context, DBNAME, null, DBVER);}@Overridepublic void onCreate(SQLiteDatabase db) {String sql = "CREATE TABLE user (userid integer primary key autoincrement, name varchar(20), age integer)";db.execSQL(sql);//执行有更改的sql语句}@Overridepublic void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {db.execSQL("DROP TABLE IF EXISTS user");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);//#号为通配符 } @Overridepublicintdelete(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/开头 */@OverridepublicStringgetType(Uriuri){ switch(MATCHER.match(uri)){ caseUSERS: return"vnd.android.cursor.dir/user"; caseUSER: return"vnd.android.cursor.item/user"; default: thrownewIllegalArgumentException("UnkwonUri:"+uri.toString()); } } @OverridepublicUriinsert(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()); } } @OverridepublicbooleanonCreate(){ this.dbOpenHelper=newDBOpenHelper(this.getContext()); returnfalse; } @OverridepublicCursorquery(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()); } } @Overridepublicintupdate(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()); } } }

package com.yaku.ContentProvider;import com.yaku.db.DBOpenHelper;import android.content.ContentProvider;import android.content.ContentUris;import android.content.ContentValues;import android.content.UriMatcher;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import .Uri;public class ContentProviderUser extends ContentProvider {private DBOpenHelper dbOpenHelper;//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);private static final int USERS = 1;private static final int USER = 2;static{//如果match()方法匹配content://com.yaku.ContentProvider.userprovider/user路径,返回匹配码为1MATCHER.addURI("com.yaku.ContentProvider.userprovider", "user", USERS);//如果match()方法匹配content://com.yaku.ContentProvider.userprovider/user/123路径,返回匹配码为2MATCHER.addURI("com.yaku.ContentProvider.userprovider", "user/#", USER);//#号为通配符}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {SQLiteDatabase db = dbOpenHelper.getWritableDatabase();int count = 0;switch (MATCHER.match(uri)) {case USERS:count = db.delete("user", selection, selectionArgs);return count;case USER://ContentUris类用于获取Uri路径后面的ID部分long id = ContentUris.parseId(uri);String where = "userid = "+ id;if(selection!=null && !"".equals(selection)){where = selection + " and " + where;}count = db.delete("user", where, selectionArgs);return count;default:throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());}}/*** 该方法用于返回当前Url所代表数据的MIME类型。* 如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头* 如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头*/@Overridepublic String getType(Uri uri) {switch (MATCHER.match(uri)) {case USERS:return "vnd.android.cursor.dir/user";case USER:return "vnd.android.cursor.item/user";default:throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());}}@Overridepublic Uri insert(Uri uri, ContentValues values) {SQLiteDatabase db = dbOpenHelper.getWritableDatabase();switch (MATCHER.match(uri)) {case USERS:long rowid = db.insert("user", "name", values); Uri insertUri = ContentUris.withAppendedId(uri, rowid);//得到代表新增记录的Urithis.getContext().getContentResolver().notifyChange(uri, null);return insertUri;default:throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());}}@Overridepublic boolean onCreate() {this.dbOpenHelper = new DBOpenHelper(this.getContext());return false;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,String sortOrder) {SQLiteDatabase db = dbOpenHelper.getReadableDatabase();switch (MATCHER.match(uri)) {case USERS:return db.query("user", projection, selection, selectionArgs, null, null, sortOrder);case USER:long id = ContentUris.parseId(uri);String where = "userid = "+ id;if(selection!=null && !"".equals(selection)){where = selection + " and " + where;}return db.query("user", projection, where, selectionArgs, null, null, sortOrder);default:throw new IllegalArgumentException("Unkwon Uri:"+ uri.toString());}}@Overridepublic int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {SQLiteDatabase db = dbOpenHelper.getWritableDatabase();int count = 0;switch (MATCHER.match(uri)) {case USERS:count = db.update("person", values, selection, selectionArgs);return count;case USER:long id = ContentUris.parseId(uri);String where = "userid = "+ id;if(selection!=null && !"".equals(selection)){where = selection + " and " + where;}count = db.update("user", values, where, selectionArgs);return count;default:throw new IllegalArgumentException("Unkwon Uri:"+ 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); } } }

package com.yaku.ContentProvider;import android.content.ContentResolver;import android.content.ContentValues;import android.database.Cursor;import .Uri;import android.test.AndroidTestCase;import android.util.Log;/*** 对ContentProvider工程中的ContentProviderActivity进行单元测试*/public class ContentProviderActivityTest extends AndroidTestCase {private static final String TAG = "ContentProvider";//往内容提供者添加数据public void testInsert() throws Throwable{ContentResolver contentResolver = this.getContext().getContentResolver();Uri insertUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user");ContentValues values = new ContentValues();values.put("name", "道长");values.put("age", 86);Uri uri = contentResolver.insert(insertUri, values);Log.i(TAG, uri.toString());}//更新内容提供者中的数据public void testUpdate() throws Throwable{ContentResolver contentResolver = this.getContext().getContentResolver();Uri updateUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user/1");ContentValues values = new ContentValues();values.put("name", "青眉道长");contentResolver.update(updateUri, values, null, null);}//从内容提供者中删除数据public void testDelete() throws Throwable{ContentResolver contentResolver = this.getContext().getContentResolver();Uri deleteUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user/1");contentResolver.delete(deleteUri, null, null);}//获取内容提供者中的数据public void testFind() throws Throwable{ContentResolver contentResolver = this.getContext().getContentResolver();Uri selectUri = Uri.parse("content://com.yaku.ContentProvider.userprovider/user");Cursor cursor = contentResolver.query(selectUri, null, null, null, "userid desc");while(cursor.moveToNext()){int id = cursor.getInt(cursor.getColumnIndex("userid"));String name = cursor.getString(cursor.getColumnIndex("name"));int age = 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"; @OverridepublicvoidonCreate(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); } @OverridepublicvoidonChange(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>

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