博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android开发14——监听内容提供者ContentProvider的数据变化
阅读量:6228 次
发布时间:2019-06-21

本文共 3752 字,大约阅读时间需要 12 分钟。

一、提出需求

有A,B,C三个应用,B中的数据需要被共享,所以B中定义了内容提供者ContentProvider;A应用修改了B应用的数据,插入了一条数据。有这样一个需求,此时C应用需要得到数据被修改的通知并处理相应操作。

 

二、示例代码

 

 
  1. A应用  
  2.  
  3. public class MainActivity extends Activity  
  4. {  
  5.  
  6.  @Override 
  7.  public void onCreate(Bundle savedInstanceState)  
  8.  {  
  9.   super.onCreate(savedInstanceState);  
  10.   setContentView(R.layout.main);  
  11.  }  
  12.  
  13.  public void insert(View v)  
  14.  {  
  15.   Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person");  
  16.   ContentResolver resolver = this.getContentResolver();  
  17.   ContentValues values = new ContentValues();  
  18.   values.put("name""xy_new_new");  
  19.   values.put("phone""xy_new_111");  
  20.   resolver.insert(uri, values);  
  21.  }  
  22. }  
  23.  
  24.  
  25. B应用  
  26. package cn.xy.cotentProvider.app.providers;  
  27. import android.content.ContentProvider;  
  28. import android.content.ContentUris;  
  29. import android.content.ContentValues;  
  30. import android.content.UriMatcher;  
  31. import android.database.Cursor;  
  32. import android.database.sqlite.SQLiteDatabase;  
  33. import android.net.Uri;  
  34. import android.util.Log;  
  35. import cn.xy.cotentProvider.service.DBOpeningHelper;  
  36.  
  37.  
  38. public class PersonProvider extends ContentProvider  
  39. {  
  40.  private DBOpeningHelper dbHelper;  
  41.  
  42.  // 若不匹配采用UriMatcher.NO_MATCH(-1)返回  
  43.  private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);  
  44.  
  45.  // 匹配码  
  46.  private static final int CODE_NOPARAM = 1;  
  47.  private static final int CODE_PARAM = 2;  
  48.  
  49.  static 
  50.  {  
  51.   // 对等待匹配的URI进行匹配操作,必须符合cn.xyCompany.providers.personProvider/person格式  
  52.   // 匹配返回CODE_NOPARAM,不匹配返回-1  
  53.   MATCHER.addURI("cn.xyCompany.providers.personProvider""person", CODE_NOPARAM);  
  54.  
  55.   // #表示数字 cn.xyCompany.providers.personProvider/person/10  
  56.   // 匹配返回CODE_PARAM,不匹配返回-1  
  57.   MATCHER.addURI("cn.xyCompany.providers.personProvider""person/#", CODE_PARAM);  
  58.  }  
  59.  
  60.  @Override 
  61.  public boolean onCreate()  
  62.  {  
  63.   dbHelper = new DBOpeningHelper(this.getContext());  
  64.   return true;  
  65.  }  
  66.  
  67.    
  68.  @Override 
  69.  public Uri insert(Uri uri, ContentValues values)  
  70.  {  
  71.   SQLiteDatabase db = dbHelper.getWritableDatabase();  
  72.   switch (MATCHER.match(uri))  
  73.   {  
  74.    case CODE_NOPARAM:  
  75.     // 若主键值是自增长的id值则返回值为主键值,否则为行号,但行号并不是RecNo列  
  76.     long id = db.insert("person""name", values);  
  77.     Uri insertUri = ContentUris.withAppendedId(uri, id);  
  78.     // 发出变化通知(非必须)设监听者为null。  
  79.     // 若设置某个监听者则不管有多少个监听者,该监听者一定可以获得该通知  
  80.     getContext().getContentResolver().notifyChange(uri, null);  
  81.     return insertUri;  
  82.    default:  
  83.     throw new IllegalArgumentException("this is unkown uri:" + uri);  
  84.   }  
  85.  }  
  86.  ......  
  87. }  
  88.  
  89.  
  90. C应用  
  91. package cn.xt.contentProvider.lisenter;  
  92. import android.app.Activity;  
  93. import android.content.ContentResolver;  
  94. import android.database.ContentObserver;  
  95. import android.database.Cursor;  
  96. import android.net.Uri;  
  97. import android.os.Bundle;  
  98. import android.os.Handler;  
  99. import android.util.Log;  
  100.  
  101. public class MainActivity extends Activity  
  102. {  
  103.  @Override 
  104.  public void onCreate(Bundle savedInstanceState)  
  105.  {  
  106.   super.onCreate(savedInstanceState);  
  107.   setContentView(R.layout.main);  
  108.   Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person");  
  109.   ContentResolver resolver = this.getContentResolver();  
  110.   resolver.registerContentObserver(uri, truenew PersonContentObserver(new Handler()));  
  111.  }  
  112.  
  113.  private class PersonContentObserver extends ContentObserver  
  114.  {  
  115.   public PersonContentObserver(Handler handler)  
  116.   {  
  117.    super(handler);  
  118.   }  
  119.  
  120.   // 得到数据的变化通知,该方法只能粗略知道数据的改变,并不能判断是哪个业务操作进行的改变  
  121.   @Override 
  122.   public void onChange(boolean selfChange)  
  123.   {  
  124.    // select * from person order by id desc limit 1 // 取得最近插入的值(序号大——>小并取第一个)  
  125.    Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person");  
  126.    ContentResolver resolver = MainActivity.this.getContentResolver();  
  127.    Cursor cursor = resolver.query(uri, nullnullnull"id desc limit 1");  
  128.    if(cursor.moveToFirst())  
  129.    {  
  130.     String name = cursor.getString(cursor.getColumnIndex("name"));  
  131.     Log.i("lisenter", name);  
  132.    }  
  133.   }  
  134.  }  
  135. }  
  136.  

关于contentProvider的基本使用,请参看本博客博文《Android开发13——内容提供者ContentProvider的基本使用》

本文转自IT徐胖子的专栏博客51CTO博客,原文链接http://blog.51cto.com/woshixy/1085439如需转载请自行联系原作者

woshixuye111

你可能感兴趣的文章
linux字符设备文件的打开操作
查看>>
Servlet介绍以及简单实例
查看>>
[js高手之路] 跟GhostWu一起封装一个字符串工具库-架构篇(1)
查看>>
Java.ftp上传下载
查看>>
【Node.js】4.从一个例子切入Node js的规范
查看>>
实施微服务架构的关键技术
查看>>
使用云服务器不得不知的操作禁忌
查看>>
“流”的思维—Workflowy
查看>>
LR IP欺骗
查看>>
关于Java读取mysql中date类型字段默认值'0000-00-00'的问题
查看>>
儿童小孩的书籍
查看>>
Git 同时与多个远程库互相同步
查看>>
为什么Linux下的环境变量要用大写而不是小写
查看>>
Linux CentOS7.0 (01)在Vmvare Workstation上 安装配置
查看>>
剑指offer九之变态跳台阶
查看>>
php rabbitmq操作类及生产者和消费者实例代码 转
查看>>
js 格式化日期 ("/Date(1400046388387)/")
查看>>
Caffe CNN特征可视化
查看>>
Python find() 方法
查看>>
java实现二叉树的构建以及3种遍历方法
查看>>