在 android 房间中建立一对多关系的方法

Ways to do One-to-many relations in android room

我正在寻找一种使用空间创建一对多关系的方法。我见过几个使用两种方法的例子。我不完全理解他们。我还没有写完整的 DAO,所以也许我在那里遗漏了一些东西。

使用 @Embedded 的方法 1

this 文档中一样,关系是通过 @Embedded 标记完成的。这种场景是不是需要设置一个ForeignKey?如果需要,如何进行 ondelete 级联

@Entity
data class User(
    @PrimaryKey val userId: Long,
    val name: String,
    val age: Int
)

@Entity
data class Playlist(
    @PrimaryKey val playlistId: Long,
    val userCreatorId: Long,
    val playlistName: String
)

data class UserWithPlaylists(
    @Embedded val user: User,
    @Relation(
          parentColumn = "userId",
          entityColumn = "userCreatorId"
    )
    val playlists: List<Playlist>
)

UserWithPlaylists 是否需要 @Entity 标签?

使用@ForeignKey 的方法 2

@Entity
data class User(
    @PrimaryKey val userId: Long,
    val name: String,
    val age: Int
)

@Entity(foreignKeys = [ForeignKey(entity = SeriesGroup::class,
    parentColumns = arrayOf("playlistId"),
    childColumns = arrayOf("userCreatorId")])
data class Playlist(
    @PrimaryKey val playlistId: Long,
    val userCreatorId: Long,
    val playlistName: String
)

在这种情况下,不需要创建一个新的 Class 加入两个实体吗?另外,我不明白为什么 ForeignKeyparentColumnschildColumns 必须是类型 数组。在这种情况下不应该是 parentColumns 一个数组和 childColumns 一个 Long (因为我们有一对多的关系)?

As in this documentation, the relation is done via @Embedded tag. In this scenario is not needed to set a ForeignKey? How to do a ondelete cascade if needed?

此方法用于检索数据,让 Room 为您生成查询。要执行 onDelete Cascade 等操作,您需要一个 ForeignKey。

Does the UserWithPlaylists needs the @Entity tag?

没有

In this scenario is not needed to create a new Class joining both Entities? Also, I don't understand why ForeignKey, parentColumns and childColumns must be of type array. Shouldn't in this case be parentColumns an array and childColumns a Long (as we have one - to many relation)?

每个查询结果都需要一些 class,因此如果您想从两个表中查询某些内容,则需要创建一个。还有 many-to-many 关系支持,因此您可能需要多个键。

这两种方式通常都会用到,它们并不排斥,而是相辅相成。