我最近才接触到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
仔细看了代码是没问题的,只能建议楼主检查:
问题已经找到,原因在于,自己写的ContentProvider,在执行完insert、delete和update后,要手动地调用getContentResolver().notifyChange()这个方法来通知改动的产生。
你的答案正确的,但是原因是什么呢
是不是对应的数据中没有
@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;
}