android 数据库监听 ContentObserver

概述

最近在写项目,有个关于插拔耳机的监听,看到有个ContentObserver类可以监听数据库
说实话,之前没有使用过这个类,今天使用了一下,还挺好用的,当插入删除数据的时候就会主动回调方法回来,我觉得很方便,而且比广播的发送的要快

ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,感觉它类似于数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。触发器分为表触发器、行触发器,相应地ContentObserver也分为“表“ContentObserver、“行”ContentObserver,当然这是与它所监听的Uri MIME Type有关的。

ContentObserver目前只能是监听通过使用Provider的数据库,直接使用文件的uri是不成功的

事例

下面监听数据库的事例

public class pzSettingContentObserver extends ContentObserver {
    private String TAG=this.getClass().getSimpleName();
    private Context context;
    /**
     * Creates a content observer.
     *
     * @param handler The handler to run {@link #onChange} on, or null if none.
     */
    public pzSettingContentObserver(Context context,Handler handler) {
        super(handler);
        this.context = context;
        registerContentObservers();
    }

//注册观察者
    private void registerContentObservers() {
        Uri uri=Uri.parse("");
        context.getContentResolver().registerContentObserver(PhoneSettings.CONTENT_URI, true,this);
    }

    @Override
    public void onChange(boolean selfChange) {
        super.onChange(selfChange);
        Log.i(TAG,"selfChange 1"+selfChange);
    }

    @Override
    public void onChange(boolean selfChange, @Nullable Uri uri) {
        super.onChange(selfChange, uri);
        Log.i(TAG,"selfChange 2"+uri.toString());
    }

    @Override
    public void onChange(boolean selfChange, @Nullable Uri uri, int flags) {
        super.onChange(selfChange, uri, flags);
        Log.i(TAG,"selfChange 3"+uri.toString()+",flags="+flags);
    }

    @Override
    public void onChange(boolean selfChange, @NonNull Collection uris, int flags) {
        super.onChange(selfChange, uris, flags);

        for (Uri uri : uris) {
            Log.i(TAG,"selfChange 4"+uri.toString()+",flags="+flags);
        }

    }
}
  //解除注册观察者
    public void unregisterContentObservers(){
        context.getContentResolver().unregisterContentObserver(this);
    }

输出的日志如下

2021-06-30 20:14:55.957 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 1false
2021-06-30 20:14:55.958 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 2content://com.android.providers.pzPhoneSetting/SysConfig/27
2021-06-30 20:14:55.958 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 3content://com.android.providers.pzPhoneSetting/SysConfig/27,flags=0
2021-06-30 20:14:55.985 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 1false
2021-06-30 20:14:55.985 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 2content://com.android.providers.pzPhoneSetting/SysConfig/28
2021-06-30 20:14:55.985 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 3content://com.android.providers.pzPhoneSetting/SysConfig/28,flags=0
2021-06-30 20:14:56.012 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 1false
2021-06-30 20:14:56.012 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 2content://com.android.providers.pzPhoneSetting/SysConfig/29
2021-06-30 20:14:56.012 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 3content://com.android.providers.pzPhoneSetting/SysConfig/29,flags=0
2021-06-30 20:14:56.037 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 1false
2021-06-30 20:14:56.038 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 2content://com.android.providers.pzPhoneSetting/SysConfig/30
2021-06-30 20:14:56.038 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 3content://com.android.providers.pzPhoneSetting/SysConfig/30,flags=0

可以看到当数据发生改变,就会调用到ContentObserver的onChange方法
从onChange方法中可以获取content://操作的是哪个数据库/哪个表/哪行

api

构造函数

    /**
     * Creates a content observer.
     *
     * @param handler The handler to run {@link #onChange} on, or null if none.
     */
    public ContentObserver(Handler handler) {
        mHandler = handler;
    }

这个api只能观察通过使用contentProvider进行的数据库监听,如果是本地直接打开的数据库,我这尝试是还没有成功监听,要是有能监听到本地直接打开数据库的方法, 欢迎大家留言

api方法.png

android开发者网站api地址

你可能感兴趣的:(android 数据库监听 ContentObserver)