2 ueryueryuery ueryueryuery 于 2012.10.22 16:51 提问

请进来看下我这样使用ContentObserver为什么观察不到db的变动?

我最近才接触到ContentObserver,今天写了个sample试了下,发现无法检测到db的改动,代码如下:

Activity onCreate()里注册:

    // register observer
        mObserver = new ComplexTableObserver(uiHandler);

        getContentResolver().registerContentObserver(
                ComplexColumns.OBSERVE_URI, true, mObserver);


Observer类:

        class ComplexTableObserver extends ContentObserver
    {
        private Handler mHandler;

        public ComplexTableObserver(Handler handler)
        {
            super(handler);
            mHandler = handler;
        }

        @Override
        public void onChange(boolean selfChange)
        {
            Utils.LOG(">onChange<");
            // trigger off loader when data updated
//          LoaderManager mManager = getLoaderManager();
//          mManager.initLoader(0, null, ComplexListActivity.this);

//          Message msg = new Message();
//          msg.what = 2;
//          msg.obj = "Data changed.";
//          mHandler.sendMessage(msg);
        }
    }

还有不论采用

public static final Uri OBSERVE_URI = Uri.parse("content://" + AUTHORITY);

或是

public final static Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/main");

都不能检测到,我修改db以后没有任何反应,db中只有一张表main,请问还有什么要注意的地方吗,比如权限啥的?

thx in advance

4个回答

pby_bob
pby_bob   2012.10.23 13:58

仔细看了代码是没问题的,只能建议楼主检查:

  1. provider是否注册。
  2. URI把"/main"加上,看你两个URI但是名称又不一样。 希望能帮到你。
ueryueryuery
ueryueryuery 谢谢你的回答
大约 5 年之前 回复
ueryueryuery
ueryueryuery   2012.10.24 09:18

问题已经找到,原因在于,自己写的ContentProvider,在执行完insert、delete和update后,要手动地调用getContentResolver().notifyChange()这个方法来通知改动的产生。

suannai0314
suannai0314 自己都回答了,为什么不采纳一下呢?还有+2哦~
接近 5 年之前 回复
eagleyan
eagleyan   Rxr 2014.12.06 06:50

你的答案正确的,但是原因是什么呢

qq_31652169
qq_31652169   2016.05.27 00:31

是不是对应的数据中没有
@Override
public Uri insert(Uri uri, ContentValues values) {
switch (matcher.match(uri)) {
case USER:
db.insert("user", null, values);
getContext().getContentResolver().notifyChange(uri, null);
break;
case USERS:
db.insert("users", null, values);
getContext().getContentResolver().notifyChange(uri, null);
break;
}
return uri;
}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!