Relation
class和class之间的关系转为为table和table之间的关系
定义data class
故事背景:小明有很多朋友Friend
,并且小明有很多旅游计划Plan
(假设是不同时段的)。他邀请Friend
到Plan
中一起旅行,而Friend
可以加入多个Plan
,那么Friend和Plan现在就构成了多对多的关系。
@Entity(tableName = "friends")
data class Friend (
@PrimaryKey val friendId: String
){
@ColumnInfo(name = "name") var friendName = ""
}
@Entity(tableName = "plans")
data class Plan (
@PrimaryKey val planId: String,
)
使用关联表(Associative Entity)
- 主键是
planId
和friendId
组成的pair
@Entity(tableName = "PlanFriends",
primaryKeys = ["planId","friendId"])
data class PlanFriend(
val planId: String,
val friendId: String
)
定义想要想要的数据类
比如想要获取Plan
里面的所有Friend
data class PlanWithFriends(
@Embedded val plan: Plan,
@Relation(
parentColumn = "planId",
entityColumn = "friendId",
associateBy = Junction(PlanFriend::class)
)
val friendList: List<Friend>
)
按照这个parentColumn
和entityColumn
,Room
就去按照关联表PlanFriends
中有的记录去提取数据。要在代码里实现两个类的关系时,就使用Dao
向PlanFriends
中插数据就行了。
使用
@Transaction
@Query("Select * From plans")
fun getPlansWithFriends(): List<PlanWithFriends>
使用注解@Transaction
,Room
就被你安排了,调用这个方法,然后Room
就根据注解然后做了一些不可描述的事情,然后你就会拿到之前定义的data class PlanWithFriends
Column的name没有设置,不然很可能弄混,就会编译通不过,对原理还是不太理解