简体   繁体   English

Android SQLiteDatabase使用带有IN或OR的where子句更新多行

[英]Android SQLiteDatabase update multiple rows using where clause with IN or OR

I have the following code which I was using to update a single row in my database: 我有以下代码用于更新数据库中的一行:

public int updateSentFieldForIncomingMessage(IncomingMessage incomingMessage)
{
    SQLiteDatabase db;
    int numberOfRowsAffected;

    try
    {
        db = super.getWritableDatabase();
    }
    catch (SQLiteException e)
    {
        File dbFile = context.getDatabasePath(DATABASE_NAME);
        db = SQLiteDatabase.openDatabase(dbFile.getAbsolutePath(), null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
    }

    try
    {
        ContentValues values = new ContentValues();
        values.put(KEY_MESSAGE_SENT, true);

        numberOfRowsAffected = db.update(TABLE_INCOMING_MESSAGES, values, KEY_ID + " = ?", new String[]{String.valueOf(incomingMessage.getId())});
    }
    finally
    {
        db.close();
    }

    return numberOfRowsAffected;
}

This works fine but now I'd like to refactor the method so that instead of a single IncomingMessage parameter, it accepts a list of IncomingMessage. 这可以正常工作,但是现在我想重构该方法,以便它接受一个I​​ncomingMessage列表,而不是单个IncomingMessage参数。 But when I get to this statement: 但是当我得到以下陈述时:

db.update(TABLE_INCOMING_MESSAGES, values, KEY_ID + " = ?", new String[]{String.valueOf(incomingMessage.getId())});

I'm not sure how to modify it so that I can specify multiple rows (via KEY_ID) in my WHERE clause. 我不确定如何修改它,以便可以在WHERE子句中指定多个行(通过KEY_ID)。 What I'd like to do is say something like KEY_ID IN ( <multiple row IDs here> ) . 我想说的是类似KEY_ID IN ( <multiple row IDs here> ) Is that possible? 那可能吗?

Is that possible? 那可能吗?

it is, but you will need a number of ? 是的,但是您将需要一些? equals to the length of String[] . 等于String[]的长度。 You can use a String builder to create such whereClause . 您可以使用String构建器来创建whereClause

Eg 例如

db.update(TABLE_INCOMING_MESSAGES, values, KEY_ID + " IN ( ?, ?, ?, ?)", new String[]{String.valueOf(incomingMessage.getId()),  "id1", "id2", "id3"});

In case you have unknown number of arguments, you can also use: 如果您有未知数量的参数,也可以使用:

String args = TextUtils.join(", ", arrayOfIds);

db.execSQL(String.format("UPDATE %s SET %s = true WHERE %s IN (%s);", 
    TABLE_INCOMING_MESSAGES, KEY_MESSAGE_SENT, KEY_ID, args));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM