我正在做一個專案,其中有一個名為 的表Messages(uuid, body, metadata_list, ... ...),我想對 message_body 和 metadata_list 列執行批量更新。我跟著這個答案。
我創建了一個資料類
MyTuple(
@ColumnInfo(name = "uuid") var uuid: String,
@ColumnInfo(name = "body") var body: SpannableStringBuilder,
@ColumnInfo(name = "mention_metadata_list") var mentionMetaDataList: List<MentionsMetaData>? = ArrayList<MentionsMetaData>()
)
然后我查詢了這些列并得到了一個list: List<MyTuple>,修改了它,現在我想在 sqlite 資料庫中批量更新這些新值。
我被卡住了,所以創建了一個 SimpleSQLiteQuery 物件,如下所示:
String rawSqlInput = "(1, 'foo1', ''bar1), (2, 'foo2', 'bar2')"; // generated using for loop.
String rawQuery = "WITH temp_table(id, new_body, mmd_list) AS (VALUES" rawSqlInput ") UPDATE messages SET body = (SELECT new_body FROM temp_table WHERE temp_table.id == messages.uuid), mention_metadata_list = (SELECT mmd_list FROM temp_table WHERE temp_table.id == messages.uuid) WHERE uuid IN (SELECT id FROM TEMP_TABLE)";
SimpleSQLiteQuery simpleSQLiteQuery = new SimpleSQLiteQuery(rawQuery);
mChatDao.bulkUpdateBodyAndMetaDataForGroupMessages(simpleSQLiteQuery); // this one works fine
而我的 dao 是這樣的:
@Dao
abstract class ChatDao {
@RawQuery
abstract fun bulkUpdateBodyAndMetaDataForGroupMessages(query: SimpleSQLiteQuery): Int;
}
這作業正常。
問題
我不想創建rawSqlInput變數,并simpleSQLiteQuery在上面使用。相反,我想通過list: List<MyTuple>內部的 dao 方法,讓房間為我處理一切。
我試過這個,但失敗了:
@Dao
abstract class ChatDao {
@Query("WITH temp_table(id, new_body, mmd_list) AS (VALUES (:mmdTuples)) UPDATE messages SET body = (SELECT new_body FROM temp_table WHERE temp_table.id == messages.uuid), mention_metadata_list = (SELECT mmd_list FROM temp_table WHERE temp_table.id == messages.uuid) WHERE uuid IN (SELECT id FROM TEMP_TABLE)")
abstract fun bulkUpdateBodyAndMetaDataForGroupMessages(mmdTuples: List<MyTuple>)
}
但它沒有用。我在“...AS (VALUES(:mmdTuples)) ...”部分出錯。那么使用 room 進行批量更新的正確語法是什么?
uj5u.com熱心網友回復:
@Update
abstract fun update(myTuple : MyTuple)
//This function is under a transaction so it will be commited to the database
//all at the same time.
@Transaction
fun update(list : List<MyTuple>){
list.forEach{
update(it)
}
}
這只是處理它的一種方法,但您可以采用從長遠來看最有可能為您提供更好服務的 upsert 方法。Android Room Persistence Library:Upsert
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/351389.html
標籤:安卓 数据库 sqlite sql更新 android-room
