Android開發14——監聽內容提供者ContentProvider的數據變化

本文出自 “IT徐胖子的專欄” 博客,請務必保留此出處http://woshixy.blog.51cto.com/5637578/1085439



一、提出需求

有A,B,C三個應用,B中的數據需要被共享,所以B中定義了內容提供者ContentProvider;A應用修改了B應用的數據,插入了一條數據。有這樣一個需求,此時C應用需要得到數據被修改的通知並處理相應操作。

二、示例代碼


  1. A應用  

  2. publicclass MainActivity extends Activity  

  3. {  

  4. @Override

  5. publicvoid onCreate(Bundle savedInstanceState)  

  6. {  

  7. super.onCreate(savedInstanceState);  

  8.  setContentView(R.layout.main);  

  9. }  

  10. publicvoid insert(View v)  

  11. {  

  12.  Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person");  

  13.  ContentResolver resolver = this.getContentResolver();  

  14.  ContentValues values = new ContentValues();  

  15.  values.put("name", "xy_new_new");  

  16.  values.put("phone", "xy_new_111");  

  17.  resolver.insert(uri, values);  

  18. }  

  19. }  

  20. B應用  

  21. package cn.xy.cotentProvider.app.providers;  

  22. import android.content.ContentProvider;  

  23. import android.content.ContentUris;  

  24. import android.content.ContentValues;  

  25. import android.content.UriMatcher;  

  26. import android.database.Cursor;  

  27. import android.database.sqlite.SQLiteDatabase;  

  28. import android.net.Uri;  

  29. import android.util.Log;  

  30. import cn.xy.cotentProvider.service.DBOpeningHelper;  

  31. publicclass PersonProvider extends ContentProvider  

  32. {  

  33. private DBOpeningHelper dbHelper;  

  34. // 若不匹配採用UriMatcher.NO_MATCH(-1)返回

  35. privatestaticfinal UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);  

  36. // 匹配碼

  37. privatestaticfinalint CODE_NOPARAM = 1;  

  38. privatestaticfinalint CODE_PARAM = 2;  

  39. static

  40. {  

  41. // 對等待匹配的URI進行匹配操作,必須符合cn.xyCompany.providers.personProvider/person格式

  42. // 匹配返回CODE_NOPARAM,不匹配返回-1

  43.  MATCHER.addURI("cn.xyCompany.providers.personProvider", "person", CODE_NOPARAM);  

  44. // #表示數字 cn.xyCompany.providers.personProvider/person/10

  45. // 匹配返回CODE_PARAM,不匹配返回-1

  46.  MATCHER.addURI("cn.xyCompany.providers.personProvider", "person/#", CODE_PARAM);  

  47. }  

  48. @Override

  49. publicboolean onCreate()  

  50. {  

  51.  dbHelper = new DBOpeningHelper(this.getContext());  

  52. returntrue;  

  53. }  

  54. @Override

  55. public Uri insert(Uri uri, ContentValues values)  

  56. {  

  57.  SQLiteDatabase db = dbHelper.getWritableDatabase();  

  58. switch (MATCHER.match(uri))  

  59.  {  

  60. case CODE_NOPARAM:  

  61. // 若主鍵值是自增長的id值則返回值爲主鍵值,否則爲行號,但行號並不是RecNo列

  62. long id = db.insert("person", "name", values);  

  63.    Uri insertUri = ContentUris.withAppendedId(uri, id);  

  64. // 發出變化通知(非必須)設監聽者爲null。

  65. // 若設置某個監聽者則不管有多少個監聽者,該監聽者一定可以獲得該通知

  66.    getContext().getContentResolver().notifyChange(uri, null);  

  67. return insertUri;  

  68. default:  

  69. thrownew IllegalArgumentException("this is unkown uri:" + uri);  

  70.  }  

  71. }  

  72. ......  

  73. }  

  74. C應用  

  75. package cn.xt.contentProvider.lisenter;  

  76. import android.app.Activity;  

  77. import android.content.ContentResolver;  

  78. import android.database.ContentObserver;  

  79. import android.database.Cursor;  

  80. import android.net.Uri;  

  81. import android.os.Bundle;  

  82. import android.os.Handler;  

  83. import android.util.Log;  

  84. publicclass MainActivity extends Activity  

  85. {  

  86. @Override

  87. publicvoid onCreate(Bundle savedInstanceState)  

  88. {  

  89. super.onCreate(savedInstanceState);  

  90.  setContentView(R.layout.main);  

  91.  Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person");  

  92.  ContentResolver resolver = this.getContentResolver();  

  93.  resolver.registerContentObserver(uri, true, new PersonContentObserver(new Handler()));  

  94. }  

  95. privateclass PersonContentObserver extends ContentObserver  

  96. {  

  97. public PersonContentObserver(Handler handler)  

  98.  {  

  99. super(handler);  

  100.  }  

  101. // 得到數據的變化通知,該方法只能粗略知道數據的改變,並不能判斷是哪個業務操作進行的改變

  102. @Override

  103. publicvoid onChange(boolean selfChange)  

  104.  {  

  105. // select * from person order by id desc limit 1 // 取得最近插入的值(序號大——>小並取第一個)

  106.   Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person");  

  107.   ContentResolver resolver = MainActivity.this.getContentResolver();  

  108.   Cursor cursor = resolver.query(uri, null, null, null, "id desc limit 1");  

  109. if(cursor.moveToFirst())  

  110.   {  

  111.    String name = cursor.getString(cursor.getColumnIndex("name"));  

  112.    Log.i("lisenter", name);  

  113.   }  

  114.  }  

  115. }  

  116. }  

關於contentProvider的基本使用,請參看本博客博文《Android開發13——內容提供者ContentProvider的基本使用》

本文出自 “IT徐胖子的專欄” 博客,請務必保留此出處http://woshixy.blog.51cto.com/5637578/1085439


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章