在 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 加入两个实体吗?另外,我不明白为什么 ForeignKey、parentColumns 和 childColumns 必须是类型 数组。在这种情况下不应该是 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 关系支持,因此您可能需要多个键。
这两种方式通常都会用到,它们并不排斥,而是相辅相成。
我正在寻找一种使用空间创建一对多关系的方法。我见过几个使用两种方法的例子。我不完全理解他们。我还没有写完整的 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 加入两个实体吗?另外,我不明白为什么 ForeignKey、parentColumns 和 childColumns 必须是类型 数组。在这种情况下不应该是 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 关系支持,因此您可能需要多个键。
这两种方式通常都会用到,它们并不排斥,而是相辅相成。