如何向房间数据库添加嵌入式和关联

问题描述

假设我有这些表:

表格-用户

存储用户

@Entity(
    tableName = "USER"
)
data class User(
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "user_id")
    val id: Int,@ColumnInfo(name = "user_name")
    val name: String
)

表格-项目

像商品一样存储商品

@Entity(
    tableName = "ITEM"
)
data class Item(
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "item_id")
    val id: Int,@ColumnInfo(name = "item_name")
    val name: String,@ColumnInfo(name = "item_description")
    val description: String
)

表格-特殊

为产品存储专业1特殊需要产品存在

@Entity(
    tableName = "SPECIAL",foreignKeys = [ForeignKey(
        entity = Item::class,parentColumns = ["item_id"],childColumns = ["special_item_id"]
    )]
)
data class Special(
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "special_id")
    val id: Int,@ColumnInfo(name = "special_item_id")
    val coupon_product_id: Int,@ColumnInfo(name = "special_name")
    val name: String,@ColumnInfo(name = "special_description")
    val description: String

)

表格-收藏夹

存储用户喜欢的特价商品

@Entity(
    tableName = "TB_FAVOURITE",foreignKeys = [ForeignKey(
        entity = User::class,parentColumns = ["user_id"],childColumns = ["favourite_user_id"]
    ),ForeignKey(
        entity = Special::class,parentColumns = ["special_id"],childColumns = ["favourite_special_id"]
    )]
)
data class Favourite(
    @PrimaryKey
    @ColumnInfo(name = "favourite_user_id")
    val id: Int,@ColumnInfo(name = "favourite_special_id")
    val specialId: Int

)

我的问题是,如何查询以选择所有的Specials,然后创建类似于存储用户是否喜欢的类的类。目前,这是一个用户应用程序,是一个演示应用程序。因此,用户永远是相同的,因此我可以对findById进行硬编码并发送用户ID。

目标

是获取查询结果的列表,其中包含:

  1. 所有特价商品
  2. 在SomeClass中应在其中包含特殊项目
  3. 一个标志,知道它是否适合该驱动程序

问题是我希望能够将会议室数据库的结果映射到所需的对象,所以我想查询比映射器更重要,我知道该怎么做。

请注意,我正在使用assets/database/mydb.db文件启动数据库,但我不知道它是否重要,因此我不知道如何使用Embedded和{{1 }}这里

查询将如何执行? db的结构是否有任何改进以使其更容易?

解决方法

我想查询比映射器更重要,我知道该怎么做。

好吧,查询取决于您想要获得的结果的结构。 在这种情况下,我不认为@Relation会有所帮助(表之间的关系太复杂了),所以我建议对JOIN使用自定义查询。

我的建议是添加一些具有所需结构的类(尽管可以更改它):

data class SpecialityDetails( 
    @Embedded
    val special: Special,@Embedded
    val item: Item,val favourite: Boolean
)

然后在DAO中添加下一个方法(据我所知,您可以在此方法中传递userId):

@Query("select *,CASE WHEN tb_favourite.favourite_user_id is null THEN 0 else 1 END as favourite from special 
INNER JOIN ITEM ON special.special_item_id = ITEM.item_id 
LEFT JOIN tb_favourite ON special.special_id = tb_favourite.favourite_special_id 
AND tb_favourite.favourite_user_id = :userId")

fun getSpecials(userId: Int): List<SpecialityDetails>

由于SpecialityDetails包含查询中的所有字段,因此客房将为您进行映射。

更新 为您的Favourite类使用复合主键

@Entity(
    tableName = "TB_FAVOURITE",primaryKeys = arrayOf("favourite_user_id","favourite_special_id"),foreignKeys = [ForeignKey(
        entity = User::class,parentColumns = ["user_id"],childColumns = ["favourite_user_id"]
    ),ForeignKey(
        entity = Special::class,parentColumns = ["special_id"],childColumns = ["favourite_special_id"]
    )]
)
data class Favourite(
    @ColumnInfo(name = "favourite_user_id")
    val id: Int,@ColumnInfo(name = "favourite_special_id")
    val specialId: Int

)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...