Android Room 数据库使用@Relation注解进行多表查询-Kotlin

Android Room 数据库使用@Relation注解进行多表查询-Kotlin

前言

在开发中用到多表一起查询的时候,我以前都是使用这个方法(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注解不是只能像上面例子那样使用,还有更多详细用法,请参考上面的 参考链接

发布了103 篇原创文章 · 获赞 31 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/sinat_38184748/article/details/104388046