Android中通过ContentProvider操作数据库

  一直以来都在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);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值