微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用带有FK的表的查询室获取完整的实体对象

如何解决如何使用带有FK的表的查询室获取完整的实体对象

假设我有这些表:

表格-用户

存储用户

@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文件来启动数据库,我不知道它是否重要。

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

解决方法

您可以创建这样的类:

class SpecialWithFavourite {
    @Embedded
    var special: Special? = null
    @Relation(parentColumn = "special_item_id",entityColumn = "item_id")
    var item: Item? = null
    @Relation(parentColumn = "special_id",entityColumn = "favourite_special_id")
    var favourite: Favourite? = null
}

,然后使用dao查询将其提取,如下所示:

@Dao
interface DaoSpecialWithFavourite {
    @Transaction
    @Query("SELECT SPECIAL.* FROM SPECIAL INNER JOIN TB_FAVOURITE WHERE TB_FAVOURITE.favourite_user_id = :userId")
    fun getLD(userId: Long): List<SpecialWithFavourite>
}

另一个选择是使用View,尤其是在您只需要几个字段的情况下

@DatabaseView("SELECT SPECIAL.*,ITEM.item_name FROM SPECIAL INNER JOIN ITEM ON ITEM.item_id = SPECIAL.special_item_id")
class FavSpecial {
    var name: String? = null
    @Embedded
    var special: Special? = null
}

根据评论中的讨论,新的Favourite

data class Favourite(
    @PrimaryKey(autoGenerate = true)
    val id: Int,@ColumnInfo(name = "favourite_user_id")
    val userid: Int,@ColumnInfo(name = "favourite_special_id")
    val specialId: Int
)

这样,您仍然可以保留约束,并且用户可以拥有多个喜欢的特价商品

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。