如何在Room多对多关系库中查询关联指定Tag ID的NameWithTags?
实现Room多对多关系下的指定标签过滤查询
要返回包含指定Tag ID的LiveData<List<NameWithTags>>,核心是先筛选出关联了目标标签的Name记录,再通过Room的@Relation自动关联对应的标签列表,具体实现如下:
DAO层查询方法
在你的DAO接口中添加以下方法:
@Query("SELECT * FROM names_table WHERE nameId IN (SELECT nameId FROM tagInName_table WHERE tagId = :targetTagId)") @Transaction fun getNamesWithSpecificTag(targetTagId: Long): LiveData<List<NameWithTags>>
逻辑说明
- 子查询
SELECT nameId FROM tagInName_table WHERE tagId = :targetTagId会先从关联表中找出所有关联了目标Tag ID的nameId; - 外层查询通过
IN关键字筛选出这些nameId对应的Name记录; - 加上
@Transaction保证查询的原子性,同时@Relation会自动为每个筛选出的Name关联其对应的所有标签(包括目标标签在内的全部关联标签)。
扩展:多标签匹配(可选)
如果需要筛选同时包含多个指定Tag ID的Name,可以调整SQL语句为:
@Query("SELECT * FROM names_table WHERE nameId IN (SELECT nameId FROM tagInName_table WHERE tagId IN (:targetTagIds) GROUP BY nameId HAVING COUNT(DISTINCT tagId) = :tagCount)") @Transaction fun getNamesWithMultipleTags(targetTagIds: List<Long>, tagCount: Int): LiveData<List<NameWithTags>>
这里通过GROUP BY nameId和HAVING COUNT(DISTINCT tagId) = :tagCount确保Name关联了所有传入的标签。
内容的提问来源于stack exchange,提问作者Faris Rizvanović
相关产品推荐
相关产品推荐

