使用密钥批量删除 Android 房间

问题描述

我有一个我之前填充的对象表和一个包含数千个 ID 的新列表,这些对象应该在表中。我想删除表中的每个对象,以防其主键不存在于 id 列表中。基本上是批量删除以摆脱旧项目。有没有一种简单的方法可以用 Room 做到这一点?我没有在文档中看到它,但我可能忽略了它。

更清楚地说,我的 id 列表是我不想删除的项目列表,并且超过了 999 sql 变量限制。

解决方法

您始终可以使用 Room 运行自定义查询。也许你可以做一些如下的事情?

@Query("delete from old_table where id not in (:ids)")
int deleteOldItems(int[] ids);

编辑:

由于要匹配和删除的数据数量众多,如果您拆分查询,上述查询将无法满足您的需求。

如果我正确理解了这个问题,那么您可能会考虑这样做。

  1. 获取旧表中已存在的 ID 列表。
  2. 将该列表与您拥有的新 ID 列表进行比较。您应该能够找到需要从表中删除的 id。
  3. 然后使用 ID(现有 - 新)运行删除查询
  4. 然后使用新添加的项目列表在表中创建新条目。

您也可以在第 3 步和第 4 步中拆分删除和插入操作,因为它们不会发生冲突。