【问题标题】:Room database onConflict = OnConflictStrategy.REPLACE not working房间数据库 onConflict = OnConflictStrategy.REPLACE 不工作
【发布时间】:2019-10-07 11:14:28
【问题描述】:

我正在研究 Room 数据库并尝试插入 项目列表(例如,在我的案例中包含作者姓名和引用的引用列表)。

以下是我正在使用的代码:

// view model
BaseApp.daoInstance?.appDao()?.insertQuotes(response!!)

// dao
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertQuotes(listData: MutableList<Quote>)

当我再次尝试插入相同的数据时,它总是作为新数据插入,而不是替换当前项目。

我对此OnConflictStrategy.REPLACE进行了大量研究,但找不到任何合适的答案。

是否有人面临同样的问题并找到了解决方案,还是我做错了什么?

提前谢谢你...!!!

【问题讨论】:

  • 冲突意味着如果它具有相同的 id,那么它将替换特定 id 的数据。我曾经像往常一样将房间数据库与 OnConflictStrategy.REPLACE 一起使用。它工作正常。
  • 但是由于数据还没有插入,我们如何实现这种冲突呢?理想情况下,一旦插入数据就会生成 id 那么您知道在我的情况下可以做什么吗?
  • 显示数据插入代码。
  • BaseApp.daoInstance?.appDao()?.insertQuotes(response!!)
  • 你能添加你的Quote实体的定义吗?

标签: android kotlin android-room


【解决方案1】:

如果您在数据库中已有报价,则不会检查和比较。 它会做的是查看主键是否已经存在于数据库中,如果存在,Room 会将所有旧数据替换为新数据。

在您的情况下,您没有指定 ID,因此数据库正在为您生成一个唯一的 ID。 您应该做的是创建一个Query,它将在数据库中搜索此引用,如下所示:

@Query("SELECT * from quote_table WHERE author = :author AND quote = :quote")
List<Quote> getQuoteByAuthorAndQuote(string author, string quote);

如果找到,则应返回带有单引号的列表,如果不存在则为空。

如果您想覆盖旧的,只需更新 Quote POJO 中的数据并使用 Room 将其插入数据库。

【讨论】:

  • 是的。这是我在代码中所做的替代方案。现在我得到了房间数据库将根据主键而不是内容值替换数据的答案。谢谢!
  • @Aanal Mehta 如果此答案对您有帮助,请将其标记为已回答,以便将来对其他人有所帮助。
  • 谢谢!这是我搜索的
  • 不是一个很好的解决方案。当您可以将引用设置为唯一键并让 Room 使用 OnConflictStrategy.REPLACE 为您替换时,为什么还要手动检查重复项?
【解决方案2】:

您是否尝试过索引主列并将其标记为唯一?

@Index(value = {"quote"}, unique = true)}

【讨论】:

    【解决方案3】:

    当我遇到同样的问题时,进口的变化就可以了,添加了以下进口:

    import androidx.room.*;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      • 2021-01-18
      相关资源
      最近更新 更多