前言
在开发中用到多表一起查询的时候,我以前都是使用这个方法(Android—Room数据库多表查询(Relationships))最近发现谷歌原生room里竟然有个@Relation注解用来解决这个问题的,用起来还相当方便,故在此记录一下。
参考链接
Relation - Android 开发者
androidx.room.Relation - Android 开发者
代码
假设一个需求,你有n个朋友,你有n种礼物,你给每个朋友都送了不止一种礼物,最后需要得到一个列表【朋友 + 得到的礼物】
创建两个数据表
第一个是朋友的表
@Entity(tableName = "friend_table")
data class FriendInfo(
// 唯一
@PrimaryKey(autoGenerate = true)
var friendId: Int = 0,
var friendName: String = ""
) : Serializable
第一个是礼物的表
@Entity(tableName = "gift_table")
data class GiftInfo(
// 唯一
@PrimaryKey(autoGenerate = true)
var giftId: Int = 0,
var giftName: String = "",
var giftLable: String = ""
) : Serializable
创建记录
再创建一个表来记录你送给朋友的礼物
@Entity(tableName = "friend_gift_table",
primaryKeys = ["friendId", "giftId"],)
data class FriendGiftRelation(
var friendId: Int = 0,
var giftId: Int = 0,
) : Serializable
创建读取合并实体类
最后你需要将这种关系一起读取出来放到一个实体里
data class FriendWithGiftList (
@Embedded
var friendInfo: FriendInfo,
@Relation(parentColumn = "friendId", // 这个参数来自于FriendInfo的唯一Key
entityColumn = "giftId", // 这个参数来自于GiftInfo的唯一Key
entity = GiftInfo::class,
associateBy = Junction(FriendGiftRelation::class))
var giftList: List<GiftInfo>
) : Serializable
创建Dao
这是读取逻辑
@Query("SELECT * FROM friend_table")
fun queryAllFriendWithGiftList() : LiveData<List<FriendWithGiftList>>
最后
当然,@Relation注解不是只能像上面例子那样使用,还有更多详细用法,请参考上面的 参考链接