房间数据库 onConflict = OnConflictStrategy.REPLACE 不起作用

Aan*_*hta 16 android kotlin android-room

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

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

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

// dao
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertQuotes(listData: MutableList<Quote>)
Run Code Online (Sandbox Code Playgroud)

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

我为此OnConflictStrategy.REPLACE研究了很多,但找不到任何正确的答案。

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

先感谢您...!!!

Ita*_*bel 12

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

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

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

如果找到,这应该返回一个带单引号的列表,如果不存在则返回空。

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

  • 这不是一个很好的解决方案。当您只需将报价设为唯一键并让 Room 使用 OnConflictStrategy.REPLACE 为您进行替换时,为什么还要手动检查重复项呢? (3认同)