Android数据库监听器+Demo

Android数据库监听器+Demo


数据库监听

  在Android开发中,常常会使用到改变数据库内容之后,马上执行相应的操作,比如:文件删除之后,下载完成之后立即显示某个视图上面的内容。很多人都是使用数据库存储,当数据库发生改变之后,有的人会去重新query一遍来获取,这样其实是十分占用内存的,还有可能因为处理cursor不当,而导致程序的内存没有释放一系列问题。

  Android内部其实提供了一个ContentObserver的东西来监听数据库的变化的。


ContentObserver

  ContentObserver的构造函数需要一个参数Hanlder,因为ContentObserver的内部是使用了一个实现Runnable接口的内部类NotificationRunnable,去实现数据库内容的变化,所以需要使用Hanlder去post消息。

注册ContentObserver的方法:

/**
* @param uri Uri的类型,这个值是需要监听的数据库的uri           
* @param notifyForDescendants boolean类的值,true的话就监听所有与此uri相关的uri。
* @param observer 需要的contentObserver
*/
getContentResolver().registerContentObserver(uri, notifyForDescendents, observer);

接着,初始一个ContentObserver对象,然后重载onChange(boolean)这个方法,当数据库变化之后,你需要做的东西都可以写在里面。

private ContentObserver observer = new ContentObserver(new Handler()) {
        @Override
        public void onChange(boolean selfChange) {
            super.onChange(selfChange);
        }
    };

最后,你需要在你不需要监听数据库的时候,及时的处理掉监听操作。

getContentResolver().unregisterContentObserver(observer);

自定义监听器

下面的监听器,是我自定义的监听器。
你可以直接用这个监听器去调用数据库监听,就和别的监听器的使用方法没啥区别。

/**
 * Created by sadaharusong on 2017/8/5 0005.
 * Github : https://github.com/sadaharusong
 * Email : jacksomangel@163.com
 */

public class DataBaseListener {
    private Context mContext;
    private onDataBaseListener mListener;

    private ContentObserver cob = new ContentObserver(new Handler()) {
        @Override
        public void onChange(boolean selfChange) {
            super.onChange(selfChange);
            mListener.onDataBaseChange();
        }
    };

    /**
     * @param uri The URI of the database to listen
     */
    DataBaseListener(Context context, Uri uri){
        this.mContext = context;
        context.getContentResolver().registerContentObserver(uri,true,cob);
    }

    public void setOnDataBaseListener(onDataBaseListener listener){
        this.mListener = listener;
    }

    public void removeOnDataBaseListener(){
        mContext.getContentResolver().unregisterContentObserver(cob);
    }

    public interface onDataBaseListener{
       void onDataBaseChange();
    }
}

然后比如你要在Activity中监听某一个数据的内容并作出相应操作的时候就可以使用

package sadaharusong.github.com.databaselistener;

import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    DataBaseListener mDataBaseListener;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //This Uri is a example,don't use it,use the uri you want listen
        mDataBaseListener = new DataBaseListener(this,Uri.EMPTY);
        mDataBaseListener.setOnDataBaseListener(new DataBaseListener.onDataBaseListener() {
            @Override
            public void onDataBaseChange() {
                // TODO: To Do Want You Want Do
            }
        });

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mDataBaseListener.removeOnDataBaseListener();
    }
}

上面监听器的地址:
https://github.com/sadaharusong/DataBaseListener
喜欢的朋友加个star~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值