会议室数据库onConflict = OnConflictStrategy.REPLACE无法正常工作

时间:2019-05-21 05:52:52

标签: android kotlin android-room

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

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

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

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

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

我对此 OnConflictStrategy.REPLACE 进行了很多研究,但找不到合适的答案。

有人遇到相同的问题并找到了解决方案吗?还是我做错了什么?

提前谢谢... !!!

3 个答案:

答案 0 :(得分:1)

房间,不会检查和比较数据库中是否已有报价。 它将执行的操作是查看数据库中是否已存在主键,Room会将所有旧数据替换为新数据。

在您的情况下,您未指定ID,因此DB会为您生成一个唯一的ID。 您应该做的是创建一个Query,它将在数据库中搜索如下所示的报价:

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

如果找到一个单引号,则此列表应返回一个单引号;如果不存在,则返回空。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:-3)

当我遇到同样的问题时,导入的更改就可以解决问题,并在导入之后添加了

import androidx.room.*;