Android数据库改变监听,ContentObserver使用

来源:互联网 发布:担保行业 知乎 编辑:程序博客网 时间:2024/06/07 18:08
一直以来都在CSDN上学习大神们的分享,自己也没写过什么东西,也写不出什么东西,呵呵!但是发现每次遇到不会的东西都会去搜索,但下次遇到后还是得重新搜索,所以,现在决定把自己在学习中遇到的问题和知识点记录下来,一方面方便自己复习,另一方面也希望能够帮助到遇到问题的朋友们。今天分享一下在使用ContentObserver时遇到的问题和解决方法;

- 自定义contentProvider
- 注册ContentObserver
- 注销ContentObserve


自定义ContentProvider

在改变数据库后调用getContext().getContentResolver().notifyChange(uri, null);这句必须有,自定义的contentprovider必须要自己notify后,ContentObserve才会收到数据库变化的消息;其中两个参数分别是Uri和ContentObserve,这个Uri必须和你注册ContentObserver时的uri一致,否则收不到消息;至于ContentObserve最好是null;

public class MsgContentProvide extends ContentProvider {    SQLiteDatabase database;    DBHelper helper;    public static String ORDER_CONTENT = "content://com.locensate.message/order_msg";    @Override    public boolean onCreate() {        helper = new DBHelper(getContext());        database = helper.getWritableDatabase();        return false;    }    UriMatcher um = new UriMatcher(UriMatcher.NO_MATCH);    {        um.addURI("com.locensate.message", "order_msg", 1);//content://com.locensate.message/order_msg        um.addURI("com.locensate.message", "ring", 2);//content://com.locensate.message/ring        um.addURI("com.locensate.message", "order_msg/#", 3);//content://com.locensate.message/ring/3        um.addURI("com.locensate.message", "ring/#", 4);        um.addURI("com.locensate.message", "ring_strategy", 5);//content://com.locensate.message/ring_strategy    }    @Nullable    @Override    public Uri insert(Uri uri, ContentValues values) {        if (um.match(uri) == 1) {            database.insert("order_msg", null, values);        } else if (um.match(uri) == 2) {            database.insert("ring", null, values);        } else if (um.match(uri) == 5) {            database.insert("ring_strategy", null, values);        } else {            throw new IllegalArgumentException("insert:内容提供者uri参数异常.");        }             getContext().getContentResolver().notifyChange(Uri.parse(ORDER_CONTENT), null);        return uri;    }    @Override    public int delete(Uri uri, String selection, String[] selectionArgs) {        int i = 0;        if (um.match(uri) == 1) {            i = database.delete("order_msg", selection, selectionArgs);        } else if (um.match(uri) == 2) {            i = database.delete("ring", selection, selectionArgs);        } else if (um.match(uri) == 5) {            i = database.delete("ring_strategy", selection, selectionArgs);        } else {            throw new IllegalArgumentException("delete:内容提供者uri参数异常.");       }                 getContext().getContentResolver().notifyChange(Uri.parse(ORDER_CONTENT), null);        return i;    }    @Override    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {        int i = 0;        if (um.match(uri) == 1) {            i = database.update("order_msg", values, selection, selectionArgs);        } else if (um.match(uri) == 2) {            i = database.update("ring", values, selection, selectionArgs);        } else {            throw new IllegalArgumentException("update:内容提供者uri参数异常");        }             getContext().getContentResolver().notifyChange(Uri.parse(ORDER_CONTENT), null);        return i;    }    @Nullable    @Override    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {        Cursor cursor = null;        if (um.match(uri) == 1) {            cursor = database.query("order_msg", projection, selection, selectionArgs, null, null, null, null);        } else if (um.match(uri) == 2) {            cursor = database.query("ring", projection, selection, selectionArgs, null, null, null, null);        } else if (um.match(uri) == 5) {            cursor = database.query("ring_strategy", projection, selection, selectionArgs, null, null, null, null);        } else if (um.match(uri) == 3) {            long id = ContentUris.parseId(uri);//拿出要查询的数字            cursor = database.query("order_msg", projection, "_id = ?", new String[]{id + ""}, null, null, null, null);        } else if (um.match(uri) == 4) {            long id = ContentUris.parseId(uri);//拿出要查询的数字            cursor = database.query("ring", projection, "_id = ?", new String[]{id + ""}, null, null, null, null);        } else {            throw new IllegalArgumentException("query :内容提供者uri参数异常");        }        return cursor;    }    @Nullable    @Override    public String getType(Uri uri) {        return null;    }

注册ContentObserve

注册完ContentObserve后再主线程中的handler中处理你的逻辑代码就Ok了;

private void registerContentObservers() {        observer = new MessageContentObserver(handler);        getContentResolver().registerContentObserver(Uri.parse(MsgContentProvide.ORDER_CONTENT), //数据库的路径Uri        false, //这个参数表示是否遵从Uri的路径去模糊匹配;true表示只要Uri的开头匹配就响应;false表示,根据绝对路径匹配        observer);} class MessageContentObserver extends ContentObserver {        public MessageContentObserver(Handler handler) {            super(handler);        }        @Override        public void onChange(boolean selfChange) {            super.onChange(selfChange);            LogUtil.e("MsgContentObserver+++++++", "+++++++=============Database changed !");            handler.sendEmptyMessage(748);        }    }

最后在activity的Ondestroy方法中注销就好了:

    @Override    protected void onDestroy() {        super.onDestroy();        getContentResolver().unregisterContentObserver(observer);    }
0 0
原创粉丝点击