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
- Android数据库改变监听,ContentObserver使用
- Android使用ContentObserver监听数据库变化
- Android使用ContentObserver监听数据库变化
- Android使用ContentObserver监听数据库变化
- Android使用ContentObserver监听数据库变化
- android 使用contentobserver监听数据库内容变化
- Android使用ContentObserver监听数据库变化
- android 使用contentobserver监听数据库内容变化
- Android学习笔记----利用ContentObserver监听数据库内容的改变
- android 监听数据库ContentObserver使用说明
- Android ContentObserver实现数据库监听
- 使用ContentObserver监听数据库变化
- 使用ContentObserver监听数据库变化
- 使用ContentObserver监听数据库变化
- 使用ContentObserver监听数据库变化
- Android 监听ConentProvider的数据改变,ContentObserver
- 使用ContentObserver监听短信数据库的变化
- ContentObserver监听数据库变化
- TextView文本折行显示
- ssh访问虚拟机下的centos慢的解决方法
- play框架使用起来(10)
- RxJava使用场景整理
- 求和 sum
- Android数据库改变监听,ContentObserver使用
- MFC六大核心机制之三:动态创建
- LeetCode 104. Maximum Depth of Binary Tree
- Scrapy ——自动多网页爬取(抓取某人博客所有文章)(四)
- C#中的字符串比较
- QT简单编程
- C++静态库与动态库
- oracle怎么查询当前用户,有多少张表
- BZOJ 3012/Luogu 3065 [Usaco2012 Dec]First!