基于Android 监听ContentProvider 中数据变化的相关介绍
如果contentprovider的访问者需要知道contentprovider中的数据的变化情况,可以在contentprovider发生数据变化时调用getcontentresolver().notifychange(uri,null)来通知注册在此uri上的访问者。
public class personcontentprovider extends contentprovider[
public uri insert(uri uri,contentvalues values){
db.insert("person","personid",values);
getcontext().getcontentresolver().notifychange(uri,null);
}//通知注册在此uri上的访问者,此外注册在insert方法上}
如果contentprovider的访问者需要得到数据变化通知,必须使用contentobserver对数据(数据使用uri描述)进行监听,当监听到数据变化通知时,系统就会调用contentobserver的onchange()方法。
public class mainactivity extends activity {
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);
uri uri = uri.parse("content://cn.wordtech.providers.personprovider/person");
this.getcontentresolver().registercontentobserver(uri, true, new personcontentdobserver(new handler()));
// 第三个对象为监听对象,当数据发生改变的时候通知此对象做相应的改变
}
@override
public boolean oncreateoptionsmenu(menu menu) {
getmenuinflater().inflate(r.menu.main, menu);
return true;
}
private class personcontentdobserver extends contentobserver {
public personcontentdobserver(handler handler) {
super(handler);
}
@override
public void onchange(boolean selfchange) {
uri uri = uri.parse("content://cn.wordtech.providers.personprovider/person");
cursor cursor = getcontentresolver().query(uri, null, null, null,"personid desc limit 1");
while (cursor.movetonext()) {
string name = cursor.getstring(cursor.getcolumnindex("name"));
log.i("name", name);
}
super.onchange(selfchange);
} }
}
测试应用:
button btn = (button) findviewbyid(r.id.btn);
btn.setonclicklistener(new onclicklistener() {
@override
public void onclick(view v) {
uri uri = uri.parse("content://cn.wordtech.providers.personprovider/person");// 根据标识名得到内容提供者
contentresolver cr = mainactivity.this.getcontentresolver();
contentvalues values = new contentvalues();
values.put("name", "livingstone");
values.put("phone", "1101");
values.put("amount", "1111111111");
cr.insert(uri, values);
}
});