Android SQLite仅更新NULL或空值列的实现问题
解决Android SQLite仅更新空/NULL列的问题
原代码核心问题
你之前的实现用rawQuery执行UPDATE语句是错误的——rawQuery仅用于执行查询类SQL(返回Cursor),不会实际执行更新操作,必须改用execSQL或update方法来处理数据变更;同时直接拼接字符串存在SQL注入风险,可能导致语法错误或安全问题。
简洁高效的实现方案
推荐将三个列的更新逻辑合并为单条UPDATE语句,用CASE表达式实现“仅空/NULL列更新”的需求,同时通过参数绑定避免SQL注入:
public void fillCal(String swin, String swout, String ripout, String kateg) { SQLiteDatabase db = this.getWritableDatabase(); String updateSql = "UPDATE " + TABLE_NAME + " SET " + COL_10 + " = CASE WHEN " + COL_10 + " IS NULL OR " + COL_10 + " = '' THEN ? ELSE " + COL_10 + " END, " + COL_11 + " = CASE WHEN " + COL_11 + " IS NULL OR " + COL_11 + " = '' THEN ? ELSE " + COL_11 + " END, " + COL_12 + " = CASE WHEN " + COL_12 + " IS NULL OR " + COL_12 + " = '' THEN ? ELSE " + COL_12 + " END " + "WHERE " + COL_7 + " = ?"; db.execSQL(updateSql, new Object[]{swin, swout, ripout, kateg}); db.close(); }
方案说明
- 用
execSQL执行更新语句:这是SQLite中执行非查询类SQL的正确方式,会直接生效 - 占位符
?绑定参数:避免直接拼接字符串导致的SQL注入风险,同时适配特殊字符场景 - 单条语句完成多列更新:减少数据库IO操作,提升执行效率
内容的提问来源于stack exchange,提问作者Darksymphony
相关产品推荐
相关产品推荐

