2015-09-23 36 views
1

的Android SQLiteDatabase更新多行,我有以下的代碼,我用的是更新我的數據庫單行:使用,其中在或條款或

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

也能正常工作,但現在我想重構該方法,以便接受IncomingMessage列表而不是單個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>)。那可能嗎?

回答

3

這可能嗎?

它是,但你需要一個?等於String[]的長度。您可以使用字符串構建器來創建此類whereClause

E.g.

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

所以,如果我的列表中它有5個值,你的意思是這樣KEY_ID +「= OR OR??? OR?OR?「,是否正確? – user685869

+1

KEY_ID IN(?,?,?,?),new String [] {「id0」,「id1」,「id2」,「id3」} – Blackbelt

+1

啊,好的。我現在明白了。非常感謝! – user685869

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