房间特权与查询的关系
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);
我有两张桌子。
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);