房间特权与查询的关系

Room privilege Relation with query

我有两张桌子。

Table 牌组:

Decks:
-id
-name

Table 卡片:

Cards:
-id
-name
-deckId

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

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>

但是我得到一个错误,因为里面的select是坏的。它无法扩充列表。

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);

我看到问题是内部 select 有 8 个项目,但只有 1 个除外。但我在那里有一个列表。如何充气?

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

Room Dao 允许非抽象方法。

如果你想 getDeckWithDueDatedCards 你可以写一个方法,首先加载所有 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;
            });
}

注意:请注意 CardEntity 上的修改会触发 subscriber 上的 onNext,但 DeckEntity 上的修改不会...

编辑:如果您需要在 DeckEntity 更改时收到通知,请更新 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);