【问题标题】:SQLite: bulk update a 'boolean' columnSQLite:批量更新“布尔”列
【发布时间】:2020-11-29 07:56:05
【问题描述】:

在 SQL (SQLite) 表中更新布尔列(即分类二进制 INTEGER 值)的标准方法是什么?

(这里的二进制意味着一个只取两个值的整数:01,因此问题标题中的引号)

给定一张桌子:

CREATE TABLE types (
    id INTEGER NOT NULL PRIMARY KEY, 
    name TEXT, 
    enabled INTEGER DEFAULT 1)

以及可以具有启用/禁用状态并表示为两个列表的对象列表:

List<Long> idsEnabled = new ArrayList<>();
List<Long> idsDisabled = new ArrayList<>();

这是存储启用状态(即01)的正确方法吗?

SQLiteDatabase db = dbHelper.getWritableDatabase();

// upd: NOT WORKING because rawQuery does NOT work for modifying data, 
// must use execSQL
db.rawQuery("UPDATE types set enabled=1 where id in (" 
    + TextUtils.join(",", idsEnabled) + ")", null);
db.rawQuery("UPDATE types set enabled=0 where id in (" 
    + TextUtils.join(",", idsDisabled) + ")", null);

是否有更好、更高效的 OOTB 方法来执行此操作?我的假设是,一一更新每一行将是最坏的情况。

这个问题不一定是特定于 android 的,尽管如果有一些特定于 android 的 API 会有所帮助。

【问题讨论】:

    标签: java android sqlite sql-update android-sqlite


    【解决方案1】:

    rawQuery()方法不是更新表的方法。
    它用于以Cursor 的形式返回行。
    在这种情况下你必须使用execSQL():

    if (idsEnabled.size() > 0 || idsDisabled.size() > 0) {
        String ids1 = TextUtils.join(",", idsEnabled);
        String ids0 = TextUtils.join(",", idsDisabled);
        String sql =
                "UPDATE types " +
                "SET enabled = CASE " +
                (idsEnabled.size() > 0 ? "WHEN id IN (" + ids1 + ") THEN 1 " : "") +
                (idsDisabled.size() > 0 ? "WHEN id IN (" + ids0 + ") THEN 0 " : "") +
                "ELSE enabled " +
                "END";
        db.execSQL(sql);
    }
    

    上述语句使用CASE 表达式来确定将更新列当前值的值。

    如果您只想更新表的一小部分,那么在UPDATE 语句中包含WHERE 子句会更有效,因此您可以省略CASE 表达式的ELSE 部分:

    if (idsEnabled.size() > 0 || idsDisabled.size() > 0) {
        String ids1 = TextUtils.join(",", idsEnabled);
        String ids0 = TextUtils.join(",", idsDisabled);
    
        String idsAll = "";
        if (idsEnabled.size() == 0) idsAll = ids0;
        else if (idsDisabled.size() == 0) idsAll = ids1;
        else idsAll = ids1 + "," + ids0;
    
        String sql =
                "UPDATE types " +
                "SET enabled = CASE " +
                (idsEnabled.size() > 0 ? "WHEN id IN (" + ids1 + ") THEN 1 " : "") +
                (idsDisabled.size() > 0 ? "WHEN id IN (" + ids0 + ") THEN 0 " : " ") +
                "END " +
                "WHERE id IN (" + idsAll + ")";
        db.execSQL(sql);
    }
    

    【讨论】:

      猜你喜欢
      • 2017-09-29
      • 2020-02-18
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多