0

所以我已经设置了一个房间数据库,一切都很好,所以我可以进行查询和插入,删除等没有问题,但是我刚刚遇到了一种情况,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 调用这个 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。有什么帮助吗?

4

1 回答 1

0

编辑:

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

资料来源:谷歌开发者培训

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

为了实现您的意图,您可以执行查询以在循环中按 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。

于 2019-05-12T12:32:00.067 回答