Android房间数据库执行批量更新的正确语法是什么



我正在处理一个项目,其中有一个名为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
abstract class ChatDao {
@RawQuery
abstract fun bulkUpdateBodyAndMetaDataForGroupMessages(query: SimpleSQLiteQuery): Int;
}

这还可以。

问题

我不想创建rawSqlInput变量,而是使用上面的simpleSQLiteQuery。相反,我想在dao方法中传递list: List<MyTuple>,并让room为我处理所有事情

我试过了,但失败了:

@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(值(:mmdTuples((&";。那么,使用room进行批量更新的正确语法是什么呢?

@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)
}
}

这只是处理它的一种方法,但从长远来看,你可以采用最有可能为你提供更好服务的追加销售方法。Android房间持久性库:Upsert

最新更新