本文转自:http://yaku2688.iteye.com/blog/1185364

ContentProvider数据共享

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

Xml代码
  1. <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代码
  1. packagecom.yaku.pojo;
  2. publicclassUser{
  3. privateintid;
  4. privateStringname;
  5. privateintage;
  6. publicUser(intid,Stringname,intage){
  7. super();
  8. this.id=id;
  9. this.name=name;
  10. this.age=age;
  11. }
  12. publicintgetId(){
  13. returnid;
  14. }
  15. publicvoidsetId(intid){
  16. this.id=id;
  17. }
  18. publicStringgetName(){
  19. returnname;
  20. }
  21. publicvoidsetName(Stringname){
  22. this.name=name;
  23. }
  24. publicintgetAge(){
  25. returnage;
  26. }
  27. publicvoidsetAge(intage){
  28. this.age=age;
  29. }
  30. @Override
  31. publicStringtoString(){
  32. return"User[age="+age+",id="+id+",name="+name+"]";
  33. }
  34. }

数据库操作DBOpenHelper.java:

Java代码
  1. packagecom.yaku.db;
  2. importandroid.content.Context;
  3. importandroid.database.sqlite.SQLiteDatabase;
  4. importandroid.database.sqlite.SQLiteOpenHelper;
  5. publicclassDBOpenHelperextendsSQLiteOpenHelper{
  6. privatestaticfinalStringDBNAME="yaku.db";//数据库名称
  7. privatestaticfinalintDBVER=1;//数据库版本
  8. publicDBOpenHelper(Contextcontext){
  9. super(context,DBNAME,null,DBVER);
  10. }
  11. @Override
  12. publicvoidonCreate(SQLiteDatabasedb){
  13. Stringsql="CREATETABLEuser(useridintegerprimarykeyautoincrement,namevarchar(20),ageinteger)";
  14. db.execSQL(sql);//执行有更改的sql语句
  15. }
  16. @Override
  17. publicvoidonUpgrade(SQLiteDatabasedb,intarg1,intarg2){
  18. db.execSQL("DROPTABLEIFEXISTSuser");
  19. onCreate(db);
  20. }
  21. }

对外共享处理类ContentProviderUser.java:

Java代码
  1. packagecom.yaku.ContentProvider;
  2. importcom.yaku.db.DBOpenHelper;
  3. importandroid.content.ContentProvider;
  4. importandroid.content.ContentUris;
  5. importandroid.content.ContentValues;
  6. importandroid.content.UriMatcher;
  7. importandroid.database.Cursor;
  8. importandroid.database.sqlite.SQLiteDatabase;
  9. importandroid.net.Uri;
  10. publicclassContentProviderUserextendsContentProvider{
  11. privateDBOpenHelperdbOpenHelper;
  12. //常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
  13. privatestaticfinalUriMatcherMATCHER=newUriMatcher(UriMatcher.NO_MATCH);
  14. privatestaticfinalintUSERS=1;
  15. privatestaticfinalintUSER=2;
  16. static{
  17. //如果match()方法匹配content://com.yaku.ContentProvider.userprovider/user路径,返回匹配码为1
  18. MATCHER.addURI("com.yaku.ContentProvider.userprovider","user",USERS);
  19. //如果match()方法匹配content://com.yaku.ContentProvider.userprovider/user/123路径,返回匹配码为2
  20. MATCHER.addURI("com.yaku.ContentProvider.userprovider","user/#",USER);//#号为通配符
  21. }
  22. @Override
  23. publicintdelete(Uriuri,Stringselection,String[]selectionArgs){
  24. SQLiteDatabasedb=dbOpenHelper.getWritableDatabase();
  25. intcount=0;
  26. switch(MATCHER.match(uri)){
  27. caseUSERS:
  28. count=db.delete("user",selection,selectionArgs);
  29. returncount;
  30. caseUSER:
  31. //ContentUris类用于获取Uri路径后面的ID部分
  32. longid=ContentUris.parseId(uri);
  33. Stringwhere="userid="+id;
  34. if(selection!=null&&!"".equals(selection)){
  35. where=selection+"and"+where;
  36. }
  37. count=db.delete("user",where,selectionArgs);
  38. returncount;
  39. default:
  40. thrownewIllegalArgumentException("UnkwonUri:"+uri.toString());
  41. }
  42. }
  43. /**
  44. *该方法用于返回当前Url所代表数据的MIME类型。
  45. *如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头
  46. *如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头
  47. */
  48. @Override
  49. publicStringgetType(Uriuri){
  50. switch(MATCHER.match(uri)){
  51. caseUSERS:
  52. return"vnd.android.cursor.dir/user";
  53. caseUSER:
  54. return"vnd.android.cursor.item/user";
  55. default:
  56. thrownewIllegalArgumentException("UnkwonUri:"+uri.toString());
  57. }
  58. }
  59. @Override
  60. publicUriinsert(Uriuri,ContentValuesvalues){
  61. SQLiteDatabasedb=dbOpenHelper.getWritableDatabase();
  62. switch(MATCHER.match(uri)){
  63. caseUSERS:
  64. longrowid=db.insert("user","name",values);
  65. UriinsertUri=ContentUris.withAppendedId(uri,rowid);//得到代表新增记录的Uri
  66. this.getContext().getContentResolver().notifyChange(uri,null);
  67. returninsertUri;
  68. default:
  69. thrownewIllegalArgumentException("UnkwonUri:"+uri.toString());
  70. }
  71. }
  72. @Override
  73. publicbooleanonCreate(){
  74. this.dbOpenHelper=newDBOpenHelper(this.getContext());
  75. returnfalse;
  76. }
  77. @Override
  78. publicCursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,
  79. StringsortOrder){
  80. SQLiteDatabasedb=dbOpenHelper.getReadableDatabase();
  81. switch(MATCHER.match(uri)){
  82. caseUSERS:
  83. returndb.query("user",projection,selection,selectionArgs,null,null,sortOrder);
  84. caseUSER:
  85. longid=ContentUris.parseId(uri);
  86. Stringwhere="userid="+id;
  87. if(selection!=null&&!"".equals(selection)){
  88. where=selection+"and"+where;
  89. }
  90. returndb.query("user",projection,where,selectionArgs,null,null,sortOrder);
  91. default:
  92. thrownewIllegalArgumentException("UnkwonUri:"+uri.toString());
  93. }
  94. }
  95. @Override
  96. publicintupdate(Uriuri,ContentValuesvalues,Stringselection,String[]selectionArgs){
  97. SQLiteDatabasedb=dbOpenHelper.getWritableDatabase();
  98. intcount=0;
  99. switch(MATCHER.match(uri)){
  100. caseUSERS:
  101. count=db.update("person",values,selection,selectionArgs);
  102. returncount;
  103. caseUSER:
  104. longid=ContentUris.parseId(uri);
  105. Stringwhere="userid="+id;
  106. if(selection!=null&&!"".equals(selection)){
  107. where=selection+"and"+where;
  108. }
  109. count=db.update("user",values,where,selectionArgs);
  110. returncount;
  111. default:
  112. thrownewIllegalArgumentException("UnkwonUri:"+uri.toString());
  113. }
  114. }
  115. }

单元测试类(在另一个应用中):

Java代码
  1. packagecom.yaku.ContentProvider;
  2. importandroid.content.ContentResolver;
  3. importandroid.content.ContentValues;
  4. importandroid.database.Cursor;
  5. importandroid.net.Uri;
  6. importandroid.test.AndroidTestCase;
  7. importandroid.util.Log;
  8. /**
  9. *对ContentProvider工程中的ContentProviderActivity进行单元测试
  10. */
  11. publicclassContentProviderActivityTestextendsAndroidTestCase{
  12. privatestaticfinalStringTAG="ContentProvider";
  13. //往内容提供者添加数据
  14. publicvoidtestInsert()throwsThrowable{
  15. ContentResolvercontentResolver=this.getContext().getContentResolver();
  16. UriinsertUri=Uri.parse("content://com.yaku.ContentProvider.userprovider/user");
  17. ContentValuesvalues=newContentValues();
  18. values.put("name","道长");
  19. values.put("age",86);
  20. Uriuri=contentResolver.insert(insertUri,values);
  21. Log.i(TAG,uri.toString());
  22. }
  23. //更新内容提供者中的数据
  24. publicvoidtestUpdate()throwsThrowable{
  25. ContentResolvercontentResolver=this.getContext().getContentResolver();
  26. UriupdateUri=Uri.parse("content://com.yaku.ContentProvider.userprovider/user/1");
  27. ContentValuesvalues=newContentValues();
  28. values.put("name","青眉道长");
  29. contentResolver.update(updateUri,values,null,null);
  30. }
  31. //从内容提供者中删除数据
  32. publicvoidtestDelete()throwsThrowable{
  33. ContentResolvercontentResolver=this.getContext().getContentResolver();
  34. UrideleteUri=Uri.parse("content://com.yaku.ContentProvider.userprovider/user/1");
  35. contentResolver.delete(deleteUri,null,null);
  36. }
  37. //获取内容提供者中的数据
  38. publicvoidtestFind()throwsThrowable{
  39. ContentResolvercontentResolver=this.getContext().getContentResolver();
  40. UriselectUri=Uri.parse("content://com.yaku.ContentProvider.userprovider/user");
  41. Cursorcursor=contentResolver.query(selectUri,null,null,null,"useriddesc");
  42. while(cursor.moveToNext()){
  43. intid=cursor.getInt(cursor.getColumnIndex("userid"));
  44. Stringname=cursor.getString(cursor.getColumnIndex("name"));
  45. intage=cursor.getInt(cursor.getColumnIndex("age"));
  46. Log.i(TAG,"id="+id+",name="+name+",age="+age);
  47. }
  48. }
  49. }

监听数据的变化:

Java代码
  1. <SPANstyle="FONT-SIZE:medium">packagecom.yaku.ContentProvider;
  2. importandroid.content.ContentResolver;
  3. importandroid.content.ContentValues;
  4. importandroid.database.Cursor;
  5. importandroid.net.Uri;
  6. importandroid.test.AndroidTestCase;
  7. importandroid.util.Log;
  8. /**
  9. *监听数据变化
  10. */
  11. publicclassOtherContentProviderTestextendsAndroidTestCase{
  12. privatestaticfinalStringTAG="OtherContentProvider";
  13. @Override
  14. publicvoidonCreate(BundlesavedInstanceState){
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.main);
  17. UriinsertUri=Uri.parse("content://com.yaku.ContentProvider.userprovider/user");
  18. ContentResolvercontentResolver=this.getContentResolver();
  19. //对指定uri进行监听,如果该uri代表的数据发生变化,就会调用PersonObserver中的onChange()
  20. contentResolver.registerContentObserver(insertUri,true,newPersonObserver(newHandler()));
  21. }
  22. privatefinalclassPersonObserverextendsContentObserver{
  23. publicPersonObserver(Handlerhandler){
  24. super(handler);
  25. }
  26. @Override
  27. publicvoidonChange(booleanselfChange){
  28. ContentResolvercontentResolver=getContentResolver();
  29. UriselectUri=Uri.parse("content://com.yaku.ContentProvider.userprovider/user");
  30. Cursorcursor=contentResolver.query(selectUri,null,null,null,"useriddesc");
  31. while(cursor.moveToNext()){
  32. intid=cursor.getInt(cursor.getColumnIndex("userid"));
  33. Stringname=cursor.getString(cursor.getColumnIndex("name"));
  34. intage=cursor.getInt(cursor.getColumnIndex("age"));
  35. Log.i(TAG,"id="+id+",name="+name+",age="+age);
  36. }
  37. }
  38. }
  39. }
  40. </SPAN>

更多相关文章

  1. Android引入签名文件
  2. android模拟器设置代理上网
  3. 启动emulator出错
  4. Android(安卓)Sqlite 相关汇总
  5. Android(安卓)binder 原理及实现机制
  6. Android(安卓)Intent
  7. Android(安卓)Intent调用大全
  8. 【置顶】Errors occurred during the build完美解决之道
  9. Spinner 使用方法小结

随机推荐

  1. Java如何操作Android的adb shell 之 我自
  2. Android——XML解析
  3. Android中的常见FC及解决方式整理
  4. android 分享 api
  5. Android消息机制 Handler
  6. android 实现由下至上弹出并位于屏幕底部
  7. Android(安卓)GPS状态改变与监听
  8. android 设置静态wifi地址
  9. Android(安卓)软键盘小知识点
  10. android短信发送器源代码