当我们的某个数据库或者数组列表等发生添加,删除等改变时,我们希望能在代码中立马知道,那么这时候可以使用内容观察者。
先在想观察的方法里注册观察者
public void add(String packageName) { SQLiteDatabase db = openHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("packagename", packageName); db.insert("info", null, values); db.close(); //自定义注册一个内容观察者,uri的字符串随便写什么,但是要有content://头。 context.getContentResolver().notifyChange(Uri.parse("content://com.example.wanghao.didisafe/applock.db"),null); } public void delete(String packageName) { SQLiteDatabase db = openHelper.getWritableDatabase(); db.delete("info", "packagename = ?", new String[]{packageName}); db.close(); //自定义注册一个内容观察者 context.getContentResolver().notifyChange(Uri.parse("content://com.example.wanghao.didisafe/applock.db"), null); }
然后在正在运行的代码中拿到这个观察者的内容解析者
//在初始化代码里注册一个内容解析者 Uri uri = Uri.parse("content://com.example.wanghao.didisafe/applock.db");//Uri是一样的 observer = new MyObserver(new Handler()); getContentResolver().registerContentObserver(uri, true, observer);在MyObserver里处理变化的数据
private class MyObserver extends ContentObserver{ public MyObserver(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); Log.i(TAG,"啊啊啊啊,我发现了数据库的内容变化了。"); protectedPacknames = dao.findAll(); }在destroy里反注册public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); getContentResolver().unregisterContentObserver(observer); observer = null;}