Android中通过ContentProvider操作数据库
2016-11-03 17:03
232 查看
一直以来都在CSDN上学习大神们的分享,自己也没写过什么东西,也写不出什么东西,呵呵!但是发现每次遇到不会的东西都会去搜索,但下次遇到后还是得重新搜索,所以,现在决定把自己在学习中遇到的问题和知识点记录下来,一方面方便自己复习,另一方面也希望能够帮助到遇到问题的朋友们。 今天分享一下在使用ContentProvider和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); }
相关文章推荐
- Android学习---通过内容提供者(ContentProvider)操作另外一个应用私有数据库的内容
- [Android Pro] 判断Uri对应的ContentProvider所操作的数据库u存在,及DownloadManager的暂停,继续
- android中向通过contentProvider向数据库中插入数据的实现
- 安卓Android通过字段映射创建sqlite数据库,操作数据库,创建表,增、删、改查,通用方法,轻松编程(by寒冬)
- Android基础之ContentProvider操作本地短信数据库
- 类查找android中跨项目的数据库操作ContentProvider的使用
- Android 通过ContentProvider数据库更新UI
- Android-ContentProvider数据库操作
- android数据库操作(ContentProvider)
- Android 通过ContentProvider数据库更新UI
- XE5 ANDROID通过webservice访问操作MSSQL数据库
- android客户端通过servlet对数据库操作(图文)
- ContentProvider操作数据库—一项古老的Android技术
- android中跨项目的数据库操作ContentProvider的使用
- XE5 ANDROID通过webservice访问操作MSSQL数据库
- 安卓:ContentProvider之服务端提供接口,客户端通过接口对数据库中的数据进行操作
- Android通过webservice操作数据库1(查询数据库)
- android 玩转ContentProvider之一--实现ContentProvider操作数据库
- Android ContentProvider之联系人数据库及操作
- android 玩转ContentProvider之一--实现ContentProvider操作数据库