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

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

 转载自:http://blog.csdn.net/woshixuye/article/details/8281385

一、提出需求

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

二、示例代码

 

A应用/** * 对内容提供者进行操作 *  * @author XY *  */public class MainActivity extends Activity{    @Override    public 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,不匹配返回-1        MATCHER.addURI("cn.xyCompany.providers.personProvider", "person", CODE_NOPARAM);        // #表示数字 cn.xyCompany.providers.personProvider/person/10        // 匹配返回CODE_PARAM,不匹配返回-1        MATCHER.addURI("cn.xyCompany.providers.personProvider", "person/#", CODE_PARAM);    }    @Override    public boolean onCreate()    {        dbHelper = new DBOpeningHelper(this.getContext());        return true;    }    /**     * 外部应用向本应用插入数据     */    @Override    public 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{    @Override    public 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);        }        // 得到数据的变化通知,该方法只能粗略知道数据的改变,并不能判断是哪个业务操作进行的改变        @Override        public 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);            }        }    }}

 

 

 

转载于:https://www.cnblogs.com/0616--ataozhijia/p/3754513.html

你可能感兴趣的文章
我的友情链接
查看>>
浅析:Android--Fragment的懒加载
查看>>
Linux操作系统目录和Linux常用的文件和目录管理命令
查看>>
DIY:自己动手做一个迷你 Linux 系统(二)
查看>>
猫猫学IOS(三十)UI之Quartz2D画图片画文字
查看>>
09值类型、引用类型、字符串
查看>>
ethereumjs/merkle-patricia-tree-2-API
查看>>
go标准库的学习-runtime
查看>>
pytorch Debug —交互式调试工具Pdb (ipdb是增强版的pdb)-1-使用说明
查看>>
NodeJS学习之文件操作
查看>>
AJAX的get和post请求原生编写方法
查看>>
WebSocket 是什么原理?为什么可以实现持久连接
查看>>
Python自学笔记-logging模块详解
查看>>
Head First--设计模式
查看>>
iOS之CAGradientLayer属性简介和使用
查看>>
微信小程序UI组件、开发框架、实用库
查看>>
模块化Javascript代码的两种方式
查看>>
Money去哪了- 每日站立会议
查看>>
Python数据结构和算法学习笔记1
查看>>
正则之从dom字符串中提取url
查看>>