【问题标题】:Room not returning duplicates房间不返回重复项
【发布时间】:2019-05-12 12:18:57
【问题描述】:

所以我已经设置了一个房间数据库,一切都很好,所以我可以进行查询和插入,删除等没有问题,但是我刚刚遇到了一种情况,id 喜欢通过他们的 ID 和重复项返回条目应该被允许,但是房间正在删除重复项,所以例如我向它发送一个 ID 列表说 并且它通过它们的 ID 返回项目但只向我发送 删除重复条目。我正在做的查询如下(顺便说一句,sql 上的完整菜鸟)

@Query("SELECT * FROM card WHERE cardId IN(:cardId)")
LiveData<List<Card>> getCardsByIds(List<Integer> cardId);

我通过我创建的存储库(只是一个抽象级别)使用它并从 ViewModel 调用这个 repo,这个 ViewModel 有一个包含 id 的可变实时数据整数列表,并使用 SwitchMap 我得到最新的实时数据。生病包括下面的相关部分

CARD REPO 像这样调用我的 Daos 方法

public LiveData<List<Card>> getCardsByIds(List<Integer> cardIds){
    return cardDao.getCardsByIds(cardIds);
}

ViewModel 调用它们

private MutableLiveData<List<Integer>> cardIds;
//** constructor etc
cards = Transformations.switchMap(cardIds, id -> cardRepository.getCardsByIds(id));

当 cardIds 列表更新时,通过 SwitchMap 的魔力进行了新的查询,我从我的片段中观察了 ViewModel。我已经对其进行了调试,因此我知道 Id 列表是正确的并且具有重复的 Id,但是返回的 LiveData 列表缺少重复的 Id。有什么帮助吗?

【问题讨论】:

  • id是数据库表的主键吗?
  • 是的,它是主键

标签: android viewmodel android-room android-livedata mutablelivedata


【解决方案1】:

编辑:

SQLiteDatabase 始终以类似于 SQL 数据库的表格格式将结果显示为光标。

来源:Google Developer Training

在查询返回结果之前,将结果存储在一个表中,如果存在主键重复的行,则默认省略。

为了实现您的目标,您可以执行查询以在循环中按 id 查找单个元素并将结果附加到列表中。

更新的 DAO 方法:

@Query("SELECT * FROM card WHERE cardId=:cardId")
LiveData<Card> getCardById(Integer cardId);

更新存储库方法:

public LiveData<List<Card>> getCardsByIds(List<Integer> cardIds){
    List list = new ArrayList();
    for(Integer cardId: cardIds){
      list.append(cardDao.getCardById(cardId));
    }
    return list;
}

希望这会有所帮助。

原答案:

如果id 是模型的主键,则不允许输入重复数据。因此,在检索时您可能会发现缺少重复项。

如果您有重复的id,请为主键创建另一个属性。 (如果您没有任何主键属性,请使用自动生成)

默认情况下,主键是 UNIQUE 而非 NULL。

【讨论】:

  • 我认为你错过了我希望它在我要求时返回相同条目两次]
  • 我没有尝试插入具有相同 id 的模型我试图多次获取相同的条目,如果它被多次询问但在同一个查询中,例如我有 ids 在我的数据库中,我想显示 相同的条目,我希望它们显示两次,但是当我查询它时,省略了重复项,这我认为不对,我认为这种情况下的 sql 应该返回。正确的结果
  • 好的,非常感谢,尽管您的 cmets 关于“为了实现您的目标,您可以执行查询以在循环中按 id 查找单个元素并将结果附加到列表中。”不适用于实时数据,因此您最初创建另一个密钥/ID 的想法可能会奏效,非常感谢
  • 我在任何地方都看不到这个引用“在查询返回结果之前,结果存储在一个表中,如果存在具有重复主键的行,默认情况下会省略它们。”
  • 这是我的理解,没有在任何地方说明。
猜你喜欢
  • 2021-09-01
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 2020-02-12
  • 1970-01-01
  • 2017-11-20
相关资源
最近更新 更多