请教个 android room 查询问题

210 天前
 magic3584
data class AreaAndMedia(
    @Embedded
    val area: Area,
    @Relation(parentColumn = "objId" , entityColumn = "bindArea")
    var medias: List<Media>
)

data class Media(
	@ColumnInfo(name = "taskId", defaultValue = "")
    val taskId: String = ""
)

interface Dao {
	@Transaction
    @Query("select * from area where objId = :areaId")
    fun selectAreaAndMediasById(areaId: String): 	Flow<List<AreaAndMedia>>
}

现在,我想新增一个查询方法,用意是过滤 Media ,例如

@Transaction
    @Query(
        "SELECT af.* FROM area af WHERE af.objId = :areaId AND EXISTS ( SELECT 1 FROM medias mi WHERE mi.bindArea = af.objId AND mi.taskId = '')"
    )
    fun selectAreaAndMediasWithEmptyTaskId(
        areaId: String
    ): Flow<List<AreaAndMedia>>

但是这个结果中,仍然包含 taskId 不为空的 Media, 不知道问题出在哪里

2386 次点击
所在节点    Android
3 条回复
linhua
210 天前
你的问题在于 @Relation 注解的使用方式。 @Relation 注解会自动加载所有与 parentColumn 匹配的 entityColumn 的记录,而不会考虑你在 @Query 中对 Media 表的过滤条件。因此,即使你在 @Query 中使用了 EXISTS 子句来过滤 Media ,@Relation 仍然会加载所有关联的 Media 对象。

https://stackoverflow.com/questions/49005681/room-relations-with-conditions
magic3584
210 天前
@linhua #1
感谢,我研究研究。
第三方库把好多实现都隐藏,有问题不好去排查。倒不如我直接写 sql 了
magic3584
210 天前
@linhua #1
Area 也是 data class, 无法像链接里一样去继承

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1112095

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX