做购物车的时候有这个需要,当点击增加数量的时候,要更更新总价与数量,也就是往数据库里更新数据,当更新完的时候,就要计算出新的价钱,这就需要对数据库进行监听。这就要用到内容观察者了。
第一步:往数据库里增删改查值的时候就不能直接调用数据库的方法了,先要下一个Contentprovider ,指向这个数据库:
package cn.zmit.neospace.provide;
import cn.zmit.neospace.db.CartDao;
import cn.zmit.neospace.model.CartData;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.net.Uri;
public class CartProvider extends ContentProvider {
private static final int INSERT = 10;
private static final int UPDATE = 20;
private static final int DELETE = 30;
private CartDao cartDao;
private static Uri changeUri=Uri.parse("content://cn.zmit.neospace.cartprovider");
private static UriMatcher matcher=new UriMatcher(UriMatcher.NO_MATCH);
static{
matcher.addURI("cn.zmit.neospace.cartprovider", "insert", INSERT);
matcher.addURI("cn.zmit.neospace.cartprovider", "update", UPDATE);
matcher.addURI("cn.zmit.neospace.cartprovider", "delete", DELETE);
}
@Override
public boolean onCreate() {
cartDao=new CartDao(getContext());
return false;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
return null;
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
int result=matcher.match(uri);
if (result==INSERT) {
CartData cartData=(CartData) values.get("cartdata");
cartDao.add(cartData);
getContext().getContentResolver().notifyChange(changeUri, null); //通知内容观察者,对应uri数据库改变
}else {
throw new IllegalArgumentException("uri地址不正确");
}
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int result=matcher.match(uri);
if (result==DELETE) {
String product_id=selectionArgs[0];
cartDao.delete(product_id);
getContext().getContentResolver().notifyChange(changeUri, null); //通知内容观察者,对应uri数据库改变
}else {
throw new IllegalArgumentException("uri地址不正确");
}
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int result=matcher.match(uri);
if (result==UPDATE) {
String newquantity= (String) values.get("newquantity");
String product_id= (String) values.get("product_id");
cartDao.update(newquantity,product_id);
getContext().getContentResolver().notifyChange(changeUri, null); //通知内容观察者,对应uri数据库改变
}else {
throw new IllegalArgumentException("uri地址不正确");
}
return 0;
}
}
当然不忘了在AndroidManifest里面注册,因为是四大组建嘛
第二步,就是一个关键的方法:
getContext().getContentResolver().notifyChange(changeUri, null); //通知内容观察者,对应uri数据库改变
当我们通过Contentprovider来改变数据库中的值的时候就可以在注册内容观察者的onChange()方法里面监听到数据的内容发生改变就可以做相应的操作了
第三步:注册内容观察者
/**
* 内容观察者
*/
private class Myobserve extends ContentObserver {
public Myobserve(Handler handler) {
super(handler);
// TODO Auto-generated constructor stub
}
@Override
public void onChange(boolean selfChange) {
amount = 0.0;
count = 0;
CommonTools.startRotate(CartActivity.this, true,
AnimationSpeed.FAST, image_loading);
new Thread() {
public void run() {
CartDao cartDao = new CartDao(CartActivity.this);
List cartDatas = cartDao.findAll();
Message msg = new Message();
msg.what = 100;
msg.obj = cartDatas;
handler.sendMessage(msg);
};
}.start();
// System.out
// .println("-----------------------------------------------数据库内容改变");
super.onChange(selfChange);
}
}
执行这行代码注册:
getContentResolver().registerContentObserver(
Uri.parse("content://cn.zmit.neospace.cartprovider"), true,
new Myobserve(new Handler()));
转载时请注明出处及相应链接,本文永久地址:https://blog.yayuanzi.com/2180.html
微信打赏
支付宝打赏
感谢您对作者wangbin的打赏,我们会更加努力! 如果您想成为作者,请点我