Android开发14——监听内容提供者ContentProvider的数据变化

来源:互联网 发布:java 数据压缩 编辑:程序博客网 时间:2024/04/30 18:58

 

一、提出需求

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

 

 

二、示例代码

A应用/** * 对内容提供者进行操作 *  * @author XY *  */public class MainActivity extends Activity{@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);}public void insert(View v){Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person");ContentResolver resolver = this.getContentResolver();ContentValues values = new ContentValues();values.put("name", "xy_new_new");values.put("phone", "xy_new_111");resolver.insert(uri, values);}}B应用package cn.xy.cotentProvider.app.providers;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 android.net.Uri;import android.util.Log;import cn.xy.cotentProvider.service.DBOpeningHelper;/** * @author XY *  */public class PersonProvider extends ContentProvider{private DBOpeningHelper dbHelper;// 若不匹配采用UriMatcher.NO_MATCH(-1)返回private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);// 匹配码private static final int CODE_NOPARAM = 1;private static final int CODE_PARAM = 2;static{// 对等待匹配的URI进行匹配操作,必须符合cn.xyCompany.providers.personProvider/person格式// 匹配返回CODE_NOPARAM,不匹配返回-1MATCHER.addURI("cn.xyCompany.providers.personProvider", "person", CODE_NOPARAM);// #表示数字 cn.xyCompany.providers.personProvider/person/10// 匹配返回CODE_PARAM,不匹配返回-1MATCHER.addURI("cn.xyCompany.providers.personProvider", "person/#", CODE_PARAM);}@Overridepublic boolean onCreate(){dbHelper = new DBOpeningHelper(this.getContext());return true;}/** * 外部应用向本应用插入数据 */@Overridepublic Uri insert(Uri uri, ContentValues values){SQLiteDatabase db = dbHelper.getWritableDatabase();switch (MATCHER.match(uri)){case CODE_NOPARAM:// 若主键值是自增长的id值则返回值为主键值,否则为行号,但行号并不是RecNo列long id = db.insert("person", "name", values); Uri insertUri = ContentUris.withAppendedId(uri, id); // 发出变化通知(非必须)设监听者为null。// 若设置某个监听者则不管有多少个监听者,该监听者一定可以获得该通知getContext().getContentResolver().notifyChange(uri, null); return insertUri;default:throw new IllegalArgumentException("this is unkown uri:" + uri);}}......}C应用package cn.xt.contentProvider.lisenter;import android.app.Activity;import android.content.ContentResolver;import android.database.ContentObserver;import android.database.Cursor;import android.net.Uri;import android.os.Bundle;import android.os.Handler;import android.util.Log;public class MainActivity extends Activity{@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person");ContentResolver resolver = this.getContentResolver();resolver.registerContentObserver(uri, true, new PersonContentObserver(new Handler()));}private class PersonContentObserver extends ContentObserver{public PersonContentObserver(Handler handler){super(handler);}// 得到数据的变化通知,该方法只能粗略知道数据的改变,并不能判断是哪个业务操作进行的改变@Overridepublic void onChange(boolean selfChange){// select * from person order by id desc limit 1 // 取得最近插入的值(序号大——>小并取第一个)Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person");ContentResolver resolver = MainActivity.this.getContentResolver();Cursor cursor = resolver.query(uri, null, null, null, "id desc limit 1");if(cursor.moveToFirst()){String name = cursor.getString(cursor.getColumnIndex("name"));Log.i("lisenter", name);}}}}

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

 

原创粉丝点击