房间不返回重复

时间:2019-05-12 12:18:57

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

所以我已经设置了一个会议室数据库,一切都很好,所以我可以进行查询和插入,删除等操作,但是没有问题,但是我遇到了ID希望通过其ID和重复项返回条目的情况应该允许,但是房间正在删除重复项,因此例如我向它发送了一个ID列表,说<1,2,3,2,3>,它按ID返回项目,但仅向我发送<1,2,3 >删除重复的条目。我正在执行的查询如下(在SQL中,顺便说一句完整的菜鸟)

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

我通过我创建的存储库(只是一个抽象级别)使用它,并从ViewModel调用此存储库,此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。我已经调试了它,所以我知道Ids列表是正确的并且具有重复的Ids,但是返回的LiveData列表缺少重复的Ids。有帮助吗?

1 个答案:

答案 0 :(得分:0)

编辑:

  

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

来源: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且NOT NULL。