代码之家  ›  专栏  ›  技术社区  ›  vihkat

带查询的房间特权关系

  •  0
  • vihkat  · 技术社区  · 6 年前

    我有两张桌子。

    桌子甲板:

    Decks:
    -id
    -name
    

    桌牌:

    Cards:
    -id
    -name
    -deckId
    

    我为此查询创建了一个数据类:

    data class DeckWithDueDatedCards(
    
            @Embedded
            var deckEntity: DeckEntity,
    
            var list: List<CardEntity>
    
    )
    

    我删除了 @Relation 在列表的顶部,因为它查询了所有卡片。 我想添加一个条件。所以我不需要所有的卡片,从甲板上。 让我们看看:

    我创建了下一个查询:

    @Query("SELECT *, (SELECT  * FROM cards WHERE deckId = D.id AND dueDate < date('now')) as list  FROM decks D WHERE D.id = :deckId")
    fun getDeckWithDueDatedCards(deckId: Long): Flowable<DeckWithDueDatedCards>
    

    但是我得到了一个错误,因为内部选择是错误的。它不能使清单膨胀。

    There is a problem with the query: [SQLITE_ERROR] SQL error or missing database (sub-select returns 8 columns - expected 1)
    public abstract io.reactivex.Flowable<....database.entity.DeckWithDueDatedCards> getDeckWithDueDatedCards(long deckId);
    

    我看到问题是内部选择有8个项目,但它只有1个。但我有一个清单。如何充气?

    有人知道如何解决这个问题吗?可以查询吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Gaëtan S    6 年前

    房间DAO允许非抽象方法。

    如果您想使用DueDatedCards获取Deck,可以编写一个方法来加载所有 CardEntity 先加载,然后加载链接 DeckEntity 建造你的 DeckWithDueDatedCards

    Java代码:

    @Query("SELECT *  FROM decks WHERE id = :deckId")
    public abstract DeckEntity loadDeck(int deckId);
    
    @Query("SELECT  * FROM cards WHERE deckId = D.id AND dueDate < :date")
    public abstract Flowable<List<CardEntity>> loadCardEntity(String date);
    
    @Transaction
    public Flowable<DeckWithDueDatedCards> getDeckWithDueDatedCards(int deckId, String date) {
        return loadCardEntity(date)
                .map(cardEntityList -> {
                    List<DeckWithDueDatedCards> res = new ArrayList<>();
                    for(CardEntity cardEntity : cardEntityList) {
                        res.add(new DeckWithDueDatedCards(cardEntity, loadDeck(deckId)));
                    }
                    return res;
                });
    }
    

    注意:注意修改 卡片实体 将触发 onNext 对你 subscriber ,但修改 甲板实体 不会。。。

    编辑:如果需要通知 甲板实体 更改更新 loadCardEntity 查询

    @Query("SELECT  cards.* FROM cards INNER JOIN decks ON cards.deckId = decks.id WHERE deckId = D.id AND dueDate < :date")
    public abstract Flowable<List<CardEntity>> loadCardEntity(String date);