Android Room中如何查询指定账户的收藏电影列表
解决指定账户收藏电影列表的查询问题
1. 先修正实体关联结构
你当前的两个实体没有绑定关联关系,selected_movies_table里缺少和账户挂钩的字段,没法直接通过JOIN查询。结合业务场景(一个账户可收藏多部电影,一部电影能被多个账户收藏),需要建立多对多关联,具体操作如下:
1.1 新增中间关联表实体
创建中间表存储账户与收藏电影的绑定关系:
@Entity( tableName = "account_selected_movies_join", primaryKeys = ["userId", "movieId"], foreignKeys = [ ForeignKey( entity = AccountEntity::class, parentColumns = ["userId"], childColumns = ["userId"], onDelete = ForeignKey.CASCADE ), ForeignKey( entity = SelectedMoviesEntity::class, parentColumns = ["id"], childColumns = ["movieId"], onDelete = ForeignKey.CASCADE ) ] ) data class AccountSelectedMoviesJoin( val userId: Int, val movieId: String )
1.2 定义查询用的数据类(适配Room的@Relation)
创建包含账户及其收藏电影的数据类,用于映射查询结果:
data class AccountWithSelectedMovies( @Embedded val account: AccountEntity, @Relation( parentColumn = "userId", entityColumn = "id", associateBy = Junction(AccountSelectedMoviesJoin::class) ) val selectedMovies: List<SelectedMoviesEntity> )
2. 编写SQL查询语句
直接SQL查询
通过三次表关联,获取指定账户的收藏电影:
SELECT sm.* FROM account_table a JOIN account_selected_movies_join aj ON a.userId = aj.userId JOIN selected_movies_table sm ON aj.movieId = sm.id WHERE a.userId = ?; -- 将?替换为目标账户的userId
Room DAO层方法
如果用Room框架,直接在DAO中定义查询方法:
@Dao interface AccountDao { @Transaction @Query("SELECT * FROM account_table WHERE userId = :userId") fun getAccountWithSelectedMovies(userId: Int): AccountWithSelectedMovies? }
3. 常见问题排查
- 之前用@Relation出错,大概率是没正确配置中间关联表,或者实体字段映射不匹配(比如parentColumn和entityColumn对应错误)
- 数据库升级时要同步创建中间表,避免出现表不存在的报错
内容的提问来源于stack exchange,提问作者Eugene Zimin
相关产品推荐
相关产品推荐

