• [Android Pro] 监听内容提供者ContentProvider的数据变化


     转载自: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);
                }
            }
        }
    }
  • 相关阅读:
    Math类的用法
    c#中和java中可变参数对比
    c#中泛型集合directory和java中map集合对比
    C#调用短信接口(通过简单的工厂模式整合多个短信平台)
    C#用网易邮箱发送邮件(同步异步)
    新浪云-PHP实现上传原图,缩略图
    PHP 继承,组合,单模式,GUID,等混合实例
    ASP.Net MVC @Html类
    ASP.net MVC 无法初始化 ASP.NET Simple Membership 数据库
    PHP 单列模式实例讲解以及参考网址
  • 原文地址:https://www.cnblogs.com/0616--ataozhijia/p/3754513.html
Copyright © 2020-2023  润新知