You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 05:00:05