利用GreenDao實現本地購物車(二)

接上文,已經實現了,GreenDao的導入,與創建開發需求所需要的數據類,以及自動生成相關的類。

接下來,就是數據庫的操作。

首先,我們拿到數據庫的操作對象,此處我選擇的是在application中,可根據自己的需求自行選擇。

/**
 * 獲取本地數據庫操作對象
 */
public CashierGoodsEntityDao getCashierGoodsEntityDao() {
    DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, "cashier_goods_entity");
    Database db = helper.getWritableDb();
    DaoSession mDaoSession = new DaoMaster(db).newSession();
    CashierGoodsEntityDao cashierGoodsEntityDao = mDaoSession.getCashierGoodsEntityDao();
    return cashierGoodsEntityDao;
}

上述代碼,兌換爲自己的相應的類即可,拿到的 CashierGoodsEntityDao就可以進行一系列的數據的操作。

/**
 * 本地購物車的初始化
 */
public void setDbData() {
    cashierGoodsEntityDao = App.getInstance().getCashierGoodsEntityDao();
    cashierGoodsEntities = new ArrayList<>();
    cashierGoodsEntities.addAll(cashierGoodsEntityDao.loadAll());//獲取所有的購物車數據
}
/**
 * 新增或者更新原有數據
 */
public void insertData() {
    entity = (CashierGoodsEntity) getIntent().getSerializableExtra("entity");
    if (entity == null || cashierGoodsEntities == null) {
        return;
    }
    if (cashierGoodsEntities.size() == 0) {
        cashierGoodsEntityDao.insert(entity);
    } else {
        for (CashierGoodsEntity cashEntity : cashierGoodsEntities) {
            if (cashEntity.getGoodsId().equals(entity.getGoodsId())) {
                int tempNumber = cashEntity.getNumber();
                cashEntity.setNumber(tempNumber + 1);
                cashierGoodsEntityDao.update(cashEntity);
                addNewData = false;
            }
        }
        if (addNewData) {
            cashierGoodsEntityDao.insert(entity);
        }
    }
    cashierGoodsEntities.clear();
    cashierGoodsEntities.addAll(cashierGoodsEntityDao.loadAll());//獲取所有的購物車數據
    adapterCashier = new AdapterCashier(this, R.layout.item_cashier_buy_product_layout, cashierGoodsEntities,this::setNumChange);
    recyclerViewShop.setLayoutManager(new LinearLayoutManager(this));
    recyclerViewShop.setAdapter(adapterCashier);
    View headView = LayoutInflater.from(this).inflate(R.layout.cashier_head_layout_for_clear_layout, null);
    adapterCashier.addHeaderView(headView);
    TextView textViewDelete = headView.findViewById(R.id.tvForClear);
    textViewDelete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            clearAllShopData(true, "");

        }
    });

    adapterCashier.setOnItemLongClickListener(new BaseQuickAdapter.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(BaseQuickAdapter adapter, View view, int position) {
            CommDialog.newInstance(screen).setClickListen(new CommDialog.TwoSelDialog() {
                @Override
                public void leftClick() {
                }

                @Override
                public void rightClick() {
                    //確定
                    clearAllShopData(false, cashierGoodsEntities.get(position).getGoodsId());

                }
            }).setTitle("刪除商品").setContent("是否刪除商品").show();
            return false;
        }
    });
}

 

/**
 * 清除所有數據,結算或者點擊清空數據時調用
 * 清空就清空當前所有數據,並且退出頁面
 * 刪除時 需要刷新數據
 */
public void clearAllShopData(boolean clearAll, String deleteId) {
    if (clearAll) {
        cashierGoodsEntityDao.deleteAll();
        finish();
        return;
    }

    if (StringUtil.isNull(deleteId)) {
        return;
    }

    for (CashierGoodsEntity cashEntity : cashierGoodsEntities) {
        if (cashEntity.getGoodsId().equals(deleteId)) {
            cashierGoodsEntityDao.delete(cashEntity);
        }
    }
    cashierGoodsEntities.clear();
    cashierGoodsEntities.addAll(cashierGoodsEntityDao.loadAll());//獲取所有的購物車數據

    if (cashierGoodsEntities.size() == 0) {
        finish();
    }else {
        adapterCashier.setNewData(cashierGoodsEntities);
    }

}
@Override
public void setNumChange(int number, String goodsId) {

    for (int i = 0; i < cashierGoodsEntities.size(); i++) {
        if (cashierGoodsEntities.get(i).getGoodsId().equals(goodsId)) {
            if (number == 0) {
                clearAllShopData(false, goodsId);
                break;
            } else {
                cashierGoodsEntities.get(i).setNumber(number);
                cashierGoodsEntityDao.update(cashierGoodsEntities.get(i));
                cashierGoodsEntities.clear();
                cashierGoodsEntities.addAll(cashierGoodsEntityDao.loadAll());//獲取所有的購物車數據
                adapterCashier.setNewData(cashierGoodsEntities);
                break;
            }

        }
    }

}

以下是購物車列表的 ,適配器中的代碼:

public class AdapterCashier extends BaseQuickAdapter<CashierGoodsEntity, BaseViewHolder> implements View.OnClickListener,
        EditDialogBuyProduct.dialogDoSure{
    private Context context;
    private int number;
    private String goodsId;
    private ItemChange listener;
    private int stock;//庫存
    private int position;
   private TextView textViewNumber;

    public AdapterCashier(Context context, int layoutResId, @Nullable List<CashierGoodsEntity> data, ItemChange listener) {
        super(layoutResId, data);
        this.context = context;
        this.listener = listener;
    }

    @Override
    protected void convert(BaseViewHolder helper, CashierGoodsEntity item) {
        StringUtil.setCommontTextShow(helper.getView(R.id.tvItemProductName), item.getName());
        StringUtil.setCommontTextShow(helper.getView(R.id.tvItemProductStock), "當前庫存爲:" + item.getStockNumber());
        StringUtil.setTextViewShowProductPrice(item.getPrice(), helper.getView(R.id.tvItemProductPrice), true);
        GlideTools.setImageShowImgNormal(context, item.getImgUrl(), helper.getView(R.id.ivItemProductImg));
        StringUtil.setCommontTextShow(helper.getView(R.id.tvItemProductNumber), item.getNumber() + "");

        TextView textViewAdd = helper.getView(R.id.tvItemProductAdd);
        textViewNumber = helper.getView(R.id.tvItemProductNumber);
        TextView textViewMinus = helper.getView(R.id.tvItemProductMinus);
        textViewAdd.setTag(item);
        textViewMinus.setTag(item);
        textViewNumber.setTag(item);

        textViewAdd.setOnClickListener(this::onClick);
        textViewNumber.setOnClickListener(this::onClick);
        textViewMinus.setOnClickListener(this::onClick);
    }

    @Override
    public void onClick(View view) {
        if (view.getTag() == null) {
            App.showToast("tag爲空");
            return;
        }
        CashierGoodsEntity entity = (CashierGoodsEntity) view.getTag();
        goodsId = entity.getGoodsId();
        stock = StringUtil.StringToInt(entity.getStockNumber());
        number = entity.getNumber();
        switch (view.getId()) {
            case R.id.tvItemProductAdd:

                if (number >= stock) {
                    App.showToast("庫存數爲:" + stock);
                    return;
                }
                number++;
                entity.setNumber(number);
                listener.setNumChange(number, goodsId);
                break;

            case R.id.tvItemProductNumber:

                EditDialogBuyProduct editDialog = new EditDialogBuyProduct(context, R.style.PXDialog,
                        this::whenPressSure, String.valueOf(number), goodsId);
                editDialog.show();
                break;

            case R.id.tvItemProductMinus:
                if (number >= 1) {
                    number--;
                    entity.setNumber(number);
                    listener.setNumChange(number, goodsId);
                }
                break;
        }

    }

    @Override
    public void onBindViewHolder(@NonNull BaseViewHolder holder, int position, @NonNull List<Object> payloads) {
        super.onBindViewHolder(holder, position, payloads);
        if (payloads.isEmpty()) {
            onBindViewHolder(holder, position);
        } else {
            textViewNumber.setText(payloads.get(0) + "");
        }

    }

    @Override
    public void whenPressSure(String number, String goodsId) {
        listener.setNumChange(StringUtil.StringToInt(number), goodsId);
    }

    public interface ItemChange {

        void setNumChange(int number, String goodsId);
    }
}

其中,數據的輸入是點擊彈出一個框,實現數據的輸入,此處不再贅述,我覺得不是什麼問題,大家可以根據自己的需求,自行修改,此處只是將我的代碼貼出來,僅供參考。

這是我這一兩天的工作成果,寫出來分享給大家,希望可以對大家有所幫助。

重點來了,走過路過不要錯過,支持一下,打賞一下,十塊八塊都是愛。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章