【问题标题】:How to replace the list of items with new list in room persistence?如何在房间持久性中用新列表替换项目列表?
【发布时间】:2025-12-12 00:05:03
【问题描述】:

实体仅包含一个项目 id ,这也是主键,我在数据库中存储例如 3 个项目,当列表更新时,我需要用新的 3 个项目替换现有列表.但就我而言,它添加了新的,但我需要完全替换现有的

  @Dao
public interface UserIdDao {
@Query("SELECT * FROM userIds")
Flowable<List<UserId>> allUserIds();

@Insert(onConflict = OnConflictStrategy.REPLACE)
 List<Long> update(List<UserId> ids);
}

@Entity
public class UserId{
  @PrimaryKey
  private Long id;

 @Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

UserId userId = (UserFavoriteStore) o;

return (!id.equals(userId.id));
 }
@Override


public int hashCode() {
int result = id.hashCode();
result = 31 * result + (id.hashCode());
return result;
 }}

【问题讨论】:

  • "列表何时更新" -- 什么列表?
  • List update(List ids);我的意思是 UserId 列表

标签: android persistence dao android-room


【解决方案1】:

我需要用新列表替换现有列表。但就我而言,它添加了新的,但我需要完全替换现有的

您编写了代码来检索 ID 和插入 ID。您没有删除 ID 的代码。

因此,向您的 DAO 添加一个 @Delete 方法以删除您不再需要的 ID。然后,当您想要替换 ID 时,请使用您的 @Delete 方法删除您不再需要的 ID,并使用您希望拥有的 @Insert 删除。

OnConflictStrategy.REPLACE 说“如果您尝试插入与现有行的主键匹配的行,请不要崩溃,而是 替换该现有行中的其他列 删除有问题的行在插入新的之前”(参见the SQLite docs)。在你的情况下:

  • 您没有其他列
  • 插入新 ID 不会与现有 ID 的主键匹配,因为您的数据完全是主键

【讨论】:

  • 好的,如果我添加的列名(字符串)可能是唯一的,但它不是primaryKey,因为它是字符串,是否可以不删除,只使用插入方法?
  • @A.A.I.A:首先,主键可以是字符串。其次,我认为 Room 目前不支持 UNIQUE 约束,仅支持唯一索引,而且我不知道 SQLite 的 REPLACE 策略如何处理这种情况。
  • 还有一个问题如果我在第一个片段中有 2 个片段,我调用 allUserIds(),第二个片段我只调用更新/删除,如果我回到第一个片段,它应该被更新,因为返回类型是流动的,我有 rx。订阅,是吗?
  • @A.A.I.A:可能,尽管我确信有很多方法会出错。
  • 即使我在 onAttach() 的同一个片段中添加了订阅获取,但是在数据库更新后它不会调用获取数据库的订阅,为什么?
最近更新 更多