当前位置: 首页 > 知识库问答 >
问题:

Android Room Database执行批量更新的正确语法是什么?

桑坚
2023-03-14

我在做一个项目,其中有一个名为Messages的表(uuid、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

我被卡住了,所以创建了一个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。相反,我想传递list: List

我尝试了这个,但失败了:

@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进行批量更新的正确语法是什么?


共有1个答案

蓬弘
2023-03-14
@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 Room持久性库:Upsert

 类似资料:
  • 问题内容: 我试图: 根据搜索条件查找文档, 如果找到,请更新一些属性 如果没有插入带有某些属性的文档。 我正在使用,因为我也在执行单个插入操作。我想在一次操作中完成所有操作。 但是,它什么都不会导致为更新/向上插入操作插入任何内容。 这是插入文档: 这是最新资料: 这就是我试图更新/更新的方式: 为什么不更新/更新呢? 注意 那是使用水线ORM的JS代码,它也使用mongodb本机驱动程序。 问

  • 问题内容: 我正在尝试在内添加HTML代码段,但无法使用包含功能。看来的当前语法与以前的语法不同:我看到许多示例使用 但是在官方文档中,它说使用 但随后在页面下方显示为 无论如何,我尝试了 我的代码片段不是很多代码,但是有很多事情要做。这可能会引起问题,所以我只用单词代替了内容,仍然一无所获。 我还尝试过直接在页面中声明模板,如下所示: 并遍历了引用脚本的所有变体,仍然一无所获。 我的页面还有很多

  • 问题内容: 我是一名新的Python程序员,他正在从2.6.4跃升至3.1.1。在我尝试使用“ else if”语句之前,一切都很好。解释器在“ else if”中的“ if”之后给了我一个语法错误,原因是我似乎无法弄清。 我可能缺少一些非常简单的东西;但是,我无法自行找到答案。 问题答案: 在python中,“ else if”被拼写为“ elif”。 另外,您还需要在和之后加上一个冒号。 简单

  • 问题内容: 认证加密要求我们使用某种可接受的标准来加密和认证消息。因此,我们既对消息进行了加密,又对消息进行了计算以验证其未被篡改。 此问题概述了一种执行基于密码的密钥加强和加密的方法: 但是据我所知,这不会在密文上计算任何MAC,因此是不安全的。在Java中执行身份验证加密的公认标准是什么? 问题答案: 我建议使用GCM模式加密。默认情况下,它包含在最新的JDK(1.7)中。它使用计数器模式加密

  • 在Haskell中执行嵌套循环有两种明显的“惯用”方法:使用列表monad或使用 : 在1s内运行。这个库使用得不多,也远不是惯用的,那么,获得快速恒定空间二维计算的惯用方法是什么呢?(注意,这不是REPA的情况,因为我想在网格上执行任意IO操作。)

  • 问题内容: 这些方法之间在功能上有区别吗? 编辑(从其他贡献者添加了此语法): 问题答案: 不,但第一个是首选样式。 编辑: 另一个选项是 此外,它还允许调用者使用varargs语法。