更新多行?

时间:2013-05-20 13:49:12

标签: android sqlite

我想更新多行。 就像make status = false where status = true,make status = true,其中id = x

try {
    String where = "id=?";
    String[] whereArgs = new String[] { Id };

    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues initialValues = new ContentValues();
    initialValues.put("status", "true");
    db.update(TABLE_PROJECT, initialValues, where, whereArgs);
    db.close();
} catch (Exception e) {
    Log.e("Exception in update query", e.toString());
}

目前发生了什么我能够第一次更新状态,但是下次我需要将之前的状态更改为false然后使用true更新新状态。我搜索并发现它可以用switch case完成,但是在这里我们如何应用它呢?

2 个答案:

答案 0 :(得分:0)

为了能够读取旧的status值,您必须在单个查询中执行这两个更新。 你是对的,这需要CASE expression;像这样的东西:

UPDATE Project
SET status = CASE
             WHEN status = 'true' THEN 'false'
             WHEN id = 'x'        THEN 'true'
             END
WHERE status = 'true' OR id = 'x'  -- don't change other records

ContentValues类仅支持文字值,而不支持表达式,因此您必须使用rawQuery代替:

db.rawQuery("UPDATE "+TABLE_PROJECT+" "+
            "SET status = CASE "+
            "WHEN status = 'true' THEN 'false' "+
            "WHEN id = ?1         THEN 'true' "+
            "END "+
            "WHERE status = 'true' OR id = ?1",
            new String[] { Id });

(这假定id是一个字符串;如果不是,则不需要使用参数。 ?1是第一个参数。)

答案 1 :(得分:-3)

try {

    String where = "id=? or status=?";
    String[] whereArgs = new String[] { Id,"false" };

    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues initialValues = new ContentValues();
    initialValues.put("status", "true");
    db.update(TABLE_PROJECT, initialValues, where, whereArgs);
    db.close();
} catch (Exception e) {
    Log.e("Exception in update query", e.toString());
}