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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 00:36:29