You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android SQLite重复商品编码无法累加数量问题求助

解决商品重复插入且数量未累加的问题

嘿,我帮你梳理下代码里的几个关键问题,正是这些问题导致了重复插入和数量没累加的情况:

1. SQL语法错误导致判断失效

你的isExist方法里的SQL语句写错了:

Cursor cursor = db.rawQuery("SELECT QTY FROM users_data WHERE CODE " + code + "'", null);

这里不仅少了判断相等的=,还缺了开头的单引号,直接导致SQL执行失败,isExist永远返回false,所以每次点击都会执行插入操作,自然就重复了。

修复方案:改用参数化查询(还能避免SQL注入),修正后的代码如下:

public boolean isExist(String code) {
    boolean result = false;
    SQLiteDatabase db = myDB.getReadableDatabase();
    Cursor cursor = null;
    try {
        // 参数化查询,语法正确且安全
        cursor = db.rawQuery("SELECT QTY FROM users_data WHERE CODE = ?", new String[]{code});
        if (cursor.getCount() > 0 && cursor.moveToFirst()){
            rQty = cursor.getInt(cursor.getColumnIndex("QTY"));
            result = true;
        }
    } catch (Exception ex){
        ex.printStackTrace(); // 打印异常方便调试问题
        result = false;
    } finally {
        // 一定要关闭Cursor和数据库,避免资源泄漏
        if (cursor != null) {
            cursor.close();
        }
        db.close();
    }
    return result;
}

另外,原来的while (cursor.moveToFirst())逻辑也不对,moveToFirst()只需要判断一次,因为我们查询的是单个编码的记录,用if就足够了。

2. 数量累加逻辑错误 + 缺少数据库更新

原来的累加代码是这样的:

rQty = Integer.parseInt(rQty + etQty.getText().toString());

这是把rQty(int类型)和输入的字符串拼接成新字符串,再转成int,比如rQty=5、输入3的话,会变成"53"转成53,这根本不是累加!而且就算你算对了,也没把新的数量写回数据库,下次查询还是原来的数值。

修复方案:先计算正确的新数量,然后执行UPDATE语句更新数据库:

btnAdd.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String code = etCode.getText().toString().trim();
        String product = etProduct.getText().toString().trim();
        String qtyStr = etQty.getText().toString().trim();
        
        // 先做基础的输入验证,避免空值或非法数字
        if (code.isEmpty() || product.isEmpty() || qtyStr.isEmpty()) {
            Toast.makeText(MainActivity.this, "请填写完整信息", Toast.LENGTH_LONG).show();
            return;
        }
        
        int addQty;
        try {
            addQty = Integer.parseInt(qtyStr);
        } catch (NumberFormatException e) {
            Toast.makeText(MainActivity.this, "数量必须是有效数字", Toast.LENGTH_LONG).show();
            return;
        }
        
        try {
            if (isExist(code)) {
                // 正确的累加逻辑:原有数量 + 新增数量
                int newQty = rQty + addQty;
                // 更新数据库中的记录
                SQLiteDatabase db = myDB.getWritableDatabase();
                ContentValues values = new ContentValues();
                values.put("QTY", newQty);
                // 根据编码更新对应记录
                int rowsUpdated = db.update("users_data", values, "CODE = ?", new String[]{code});
                db.close();
                
                if (rowsUpdated > 0) {
                    Toast.makeText(MainActivity.this, "商品数量已累加", Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(MainActivity.this, "数量更新失败", Toast.LENGTH_LONG).show();
                }
            } else {
                myDB.addData(code, product, addQty);
                Toast.makeText(MainActivity.this, "数据已成功插入", Toast.LENGTH_LONG).show();
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            Toast.makeText(MainActivity.this, "操作出错啦", Toast.LENGTH_LONG).show();
        }
    }
});

额外优化建议

  • 给数据库的CODE字段添加唯一约束,这样即使业务逻辑出问题,数据库层面也能阻止重复插入相同编码的记录。
  • 把数据库更新的逻辑封装到你的myDB类里,比如新增一个updateProductQty(String code, int newQty)方法,让代码更整洁、易维护。

内容的提问来源于stack exchange,提问作者iqa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:48:09