所以我已经设置了一个会议室数据库,一切都很好,所以我可以进行查询和插入,删除等操作,但是没有问题,但是我遇到了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。有帮助吗?
答案 0 :(得分:0)
编辑:
SQLiteDatabase始终以类似于SQL数据库的表格式将结果显示为Cursor。
在查询返回结果之前,结果将存储在表中,并且如果存在具有重复主键的行,则默认情况下将省略它们。
要实现预期的目标,可以执行查询以循环查找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。