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~