Android SQLite数据库列值自增功能实现求助(新手)
嗨,我来帮你搞定这两个让你头疼的问题,让你的数据库更新正常工作起来!
第一个问题:execSQL报错Empty bindArgs的原因和修复
你用的execSQL(String sql, Object[] bindArgs)方法有个规则:如果传递了bindArgs参数,你的SQL语句里必须包含对应的?占位符。但你现在的SQL是直接拼接了date和meal的字符串,没有用占位符,却传了null作为bindArgs,这就触发了IllegalArgumentException。
而且直接拼接字符串还有SQL注入风险,所以更推荐用占位符的安全写法:
public void updateItems(String date, String meal){ SQLiteDatabase database = getWritableDatabase(); // 用?作为占位符,避免SQL注入,同时匹配bindArgs参数 database.execSQL("UPDATE meal_table SET On_Menu = On_Menu + 1 WHERE date = ? AND Meal = ?", new String[]{date, meal}); }
如果你不想用占位符(不推荐),也可以调用不带bindArgs的重载方法:
public void updateItems(String date, String meal){ SQLiteDatabase database = getWritableDatabase(); database.execSQL("UPDATE meal_table SET On_Menu = On_Menu + 1 WHERE date = '" + date + "' AND Meal = '" + meal + "'"); }
第二个问题:rawQuery无法更新数据库的原因和修复
rawQuery方法是专门用来执行**查询语句(SELECT)**的,它不会执行INSERT、UPDATE、DELETE这类修改数据库的操作,所以你调用它之后数据库没有任何变化是正常的。
要执行更新操作,还是得用execSQL,或者Android推荐的update方法(不过update方法用ContentValues只能设置固定值,没法直接做On_Menu + 1这种自增操作,所以execSQL更适合你的场景)。
另外还要检查你按钮点击事件里的参数:确保meal变量已经正确赋值,比如是不是忘了给它设置值,导致WHERE条件不匹配,所以数据库没有找到要更新的行?比如你代码里的sqLiteDatabase.updateItems(date,meal);,这里的meal如果是空或者和数据库里的值不匹配,也会出现“无报错但没更新”的情况。
最终推荐的完整实现
把你的更新方法改成带占位符的execSQL写法,然后在按钮点击事件里确保参数正确:
DatabaseHelper里的方法
public void updateMenuCount(String date, String meal) { SQLiteDatabase db = getWritableDatabase(); try { db.execSQL("UPDATE meal_table SET On_Menu = On_Menu + 1 WHERE date = ? AND Meal = ?", new String[]{date, meal}); } finally { db.close(); // 记得关闭数据库,避免资源泄漏 } }
按钮点击事件
imageButton1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { Toast.makeText(MenuCheck.this, "Wonderful!", Toast.LENGTH_SHORT).show(); String date = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(new Date()); // 确保meal变量有正确的值,比如从EditText获取或者提前定义 String meal = "午餐"; // 这里替换成你的实际meal值 dbHelper.updateMenuCount(date, meal); // dbHelper是你的DatabaseHelper实例 } });
这样点击按钮后,数据库里符合条件的行的On_Menu列就会自动加1啦!
内容的提问来源于stack exchange,提问作者ybee

