java - 如何将嵌入式和关系添加到房间数据库
问题描述
假设我有这些表:
表 - 用户
存储用户
@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
)
我的问题是,如何进行查询以选择所有特价商品,然后创建一个类来存储用户是否喜欢它。目前它是一个用户应用程序,它是一个演示应用程序。因此,用户将始终相同,因此我可以硬编码findById
并发送用户的 ID。
目标
是将查询结果作为 List 获取,其中包含:
- 所有特价商品
- 在 SomeClass 里面应该包含 Special 的 Item
- 一个标志,知道它是否是那个司机最喜欢的
问题是我希望能够将房间数据库的结果映射到我想要的对象,所以我猜查询比映射器更重要,我知道如何做映射器。
请注意,我正在使用一个assets/database/mydb.db
文件来启动数据库,我不知道它是否重要,所以我不知道如何使用Embedded
和Relation
here
查询将如何做到这一点?数据库的结构是否有任何改进以使其更容易?
解决方案
我猜查询比映射器更重要,我知道如何做映射器。
好吧,查询取决于您想要获得的结果的结构。我不认为@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>
Room 将为您进行映射,因为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
)
推荐阅读
- tensorflow - NLP 中计算 dp sgd 隐私的样本数量是多少?
- python - 是否只允许用户将整数放入条目中
- python - 用 Selenium python 读取网站的一部分很热
- reactjs - 如何显示/隐藏通过反应动态呈现的数据数组中的一个元素
- google-colaboratory - 在 google colaboratory 中导入 caffe
- flutter - 从 ListView 中的实例调用 setState
- python - 如何从数据框中删除行头
- python - 401 客户端错误:未经授权的 url:https://storage.scrapinghub.com/collections
- linux - cmake install() 行为?如果给出此指令,为什么二进制会在 PWD 中查找
- c++ - 这个数组是如何改变它的值的?