Android Jetpack:Room Relation - Many To Many

Relation

class和class之间的关系转为为table和table之间的关系

定义data class

故事背景:小明有很多朋友Friend,并且小明有很多旅游计划Plan(假设是不同时段的)。他邀请FriendPlan中一起旅行,而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)

  1. 主键是planIdfriendId组成的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>
)

按照这个parentColumnentityColumnRoom就去按照关联表PlanFriends中有的记录去提取数据。要在代码里实现两个类的关系时,就使用DaoPlanFriends中插数据就行了。

使用

  @Transaction
  @Query("Select * From plans")
  fun getPlansWithFriends(): List<PlanWithFriends>
    

使用注解@TransactionRoom就被你安排了,调用这个方法,然后Room就根据注解然后做了一些不可描述的事情,然后你就会拿到之前定义的data class PlanWithFriends


Column的name没有设置,不然很可能弄混,就会编译通不过,对原理还是不太理解

猜你喜欢

转载自blog.csdn.net/qq_43709922/article/details/104173103