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
相关产品推荐
相关产品推荐

