Room DAO 更新如何最好地处理旧的不需要的数据

Posted

技术标签:

【中文标题】Room DAO 更新如何最好地处理旧的不需要的数据【英文标题】:Room DAO Update how best to handle old unwanted data 【发布时间】:2021-10-08 14:54:26 【问题描述】:

我有一个 Room 对象表,当我收到网络调用以刷新对象列表时,这些项目可能已更改。所以我需要删除所有不再在新获取列表中的数据。

表中的预取 ID: |对象标识| |:-------| |1| |2| |3| |4|

表中的获取后 ID: |对象标识| |:-------| |1| |2| |4|

所以对象被移除: |对象标识| |:-------| |3|

我的问题: 最好的方法是在调用@insert 方法之前删除表中的所有条目,或者是否有另一种使用@update 的方法可以让我简单地获取新数据并删除不再在新对象列表中的所有旧数据?我的理解是 @update 只会更新对象 1,2 和 4 并保持 3 不变。

【问题讨论】:

【参考方案1】:

由于您有一个 id 列表(假设这些唯一标识行),那么您可以根据列表进行更新,并使用 WHERE 子句根据列表删除(更新之前或之后)NOT IN operator(s)

请注意,删除应通过 @Query 而不是 @Delete 来完成,例如@QUERY("DELETE FROM the_table WHERE id NOT IN(:the_id_list);"

这将最大限度地减少删除次数。删除和更新应在单个 transaction 中完成。

【讨论】:

谢谢,没想到@transaction方法。

以上是关于Room DAO 更新如何最好地处理旧的不需要的数据的主要内容,如果未能解决你的问题,请参考以下文章

Room:不确定如何将 Cursor 转换为此方法的返回类型

如何最好地将一个巨大的.sqlite数据库移动到旧的低内存iOS设备上的新目录中?

Android Room 通用 DAO

将 TypeConverters 应用到 Dao Android Room

Room - 如何从 DAO 查询中获取 COUNT 值?

Android Room Dao:按 CASE 排序不起作用