ContentProvider(二)

4. ContentResolver 内容解析者

ContentResolver 主要是通过URI调用getContentResolver()获取ContentProvider 提供的数据接口,进而进行增删改查等操作。

// 查询
    Cursor cursor = getContentResolver().query(Uri.parse(uri), null, null, null, null);
// 插入数据到指定 URI 中
 getContentResolver().insert(Uri.parse(uri), ContentValues);

5.ContentObserver 内容观察者

ContentObserver 内容观察者通过指定URI 监听ContentProvider数据是否改变。

  • 自定义 ContentObserver 内容观察者

1.注册ContentObserver 内容观察者 registerContentObserver

    /**
     * 监听ContentProvider数据库变化
     */
    private void ContentObserverDatabase() {
        // [1]注册内容观察者
        Uri uri = Uri.parse("content://ProgramAndroid/person");
        // false 观察的uri 必须是一个确切的uri 如果是true
        getContentResolver().registerContentObserver(uri, true,
                new CustomContentObserver(new Handler()));
    }

2.继承 ContentObserver 实现 onChange方法

package com.programandroid.ContentProvider;

import android.database.ContentObserver;
import android.os.Handler;

/*
 * CustomContentObserver.java
 *
 *  Created on: 2017-9-13
 *      Author: wangjie
 * 
 *  Welcome attention to weixin public number get more info
 *
 *  WeiXin Public Number : ProgramAndroid
 *  微信公众号 :程序员Android
 *
 */
public class CustomContentObserver extends ContentObserver {

    /**
     * @param handler
     */
    public CustomContentObserver(Handler handler) {
        super(handler);
        // TODO Auto-generated constructor stub
    }

    // 当我们观察的uri发生改变的时候调用
    @Override
    public void onChange(boolean selfChange) {
        System.out.println(" 数据库被操作了 ");

        super.onChange(selfChange);
    }

}

至此自定义内容观察者已经实现完成

  • 调用ContentObserver 监听短信数据改变

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //[1]注册一个内容观察者
        Uri uri = Uri.parse("content://sms/");
        getContentResolver().registerContentObserver(uri, true, new MyContentObserver(new Handler()));

    }

    private class MyContentObserver extends ContentObserver{

        public MyContentObserver(Handler handler) {
            super(handler);
        }
        //当观察的内容发生改变的时候调用
        @Override
        public void onChange(boolean selfChange) {
            System.out.println(" 短信的数据库发生了改变");
            super.onChange(selfChange);
        }

    }

6. ContentProvider ContentResolver ContentObserver 三者关系

  • 三者关系图如下

0?wx_fmt=png

欢迎关注微信公众号:程序员Android

微信公众号:ProgramAndroid

我们不是牛逼的程序员,我们只是程序开发中的垫脚石。

0?wx_fmt=gif

点击阅读原文,获取更多福利

0?wx_fmt=gif

posted @ 2017-09-13 23:24  程序员Android的博客  阅读(56)  评论(0编辑  收藏  举报