Android SQLiteDatabase使用带有IN或OR

时间:2015-09-23 18:01:18

标签: java android sqlite

我有以下代码用于更新数据库中的单行:

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;
}

这很好但现在我想重构该方法,以便它接受一个I​​ncomingMessage列表,而不是一个IncomingMessage参数。但是当我接受这个声明时:

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

我不知道如何修改它,以便我可以在WHERE子句中指定多行(通过KEY_ID)。我想做的是说KEY_ID IN ( <multiple row IDs here> )之类的话。这可能吗?

2 个答案:

答案 0 :(得分:5)

  

这可能吗?

确实如此,但您需要?个等于String[]的长度。您可以使用“字符串”构建器来创建此类whereClause

E.g。

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

答案 1 :(得分:1)

如果你有不明数量的参数,你也可以使用:

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));