【问题标题】:Many to Many relationship in Room房间中的多对多关系
【发布时间】:2018-09-10 11:53:02
【问题描述】:

我在 Room 中有 1:N 关系,看起来像这样(典型的 Owner:List 关系):

class NewsFeedAndPersonItem {
    @Embedded
    lateinit var newsFeedItem: NewsFeedItem
    @Relation(
        parentColumn = "userId", entityColumn = "id"
    )
    var listOfPersons: List<Person> = listOf()

    fun getPerson() = listOfPersons.firstOrNull()

    fun getAvatar() = getPerson()?.photoSmallLink

    fun isPost() = newsFeedItem.type == 2

    fun NewsFeedAndPerson() {}

    fun NewsFeedAndPerson(newsFeedItem: NewsFeedItem, person: List<Person>) {
        this.newsFeedItem = newsFeedItem
        this.listOfPersons = person
    }
}

NewsfeedItem:

@Entity
@TypeConverters(NewsFeedTypeConverters::class)
class NewsFeedItem(

    // Common
    @PrimaryKey @Json(name = ParserConst.DEFAULT_ID) var id: Int = 0,

    @Json(name = ParserConst.USER_ID) var userId: Int = 0,

    @Json(name = ParserConst.CREATED_AT) var createdAt: String? = null,

    @Json(name = ParserConst.NEWS_FEED_TYPE) var type: Int? = null,

)

人:

@Entity
data class Person(

    @PrimaryKey var id: Int = 0,

    var favourite: Boolean = false,

    var online: Boolean = false,

)

到目前为止一切顺利。问题是我需要将 NewsFeed userId:String 参数更改为 userIds (List) 列表

我的问题是是否仍然可以通过@Relation 解决,或者是否有任何简单的替代方法来实现这一点。

【问题讨论】:

  • 您需要一个单独的连接实体来表示关系。如果您愿意,您应该可以使用@Relation
  • 好的,你能告诉我这个实体应该是什么样子吗?
  • Here is a join entity 加入CustomerCategory。我碰巧将它实现为 static 类,尽管这不是必需的。

标签: android kotlin android-room


【解决方案1】:

通过在两个现有表“之间”创建一个新表并与新创建的表创建两个 1:N 关系来解决多对多关系。

示例: 一个人可以拥有多辆汽车,而一辆汽车可以由许多人拥有。要解决这种多对多关系,您可以创建一个 Owner 表,其中包含对 Person PK 的 FK 引用和对 Car PK 的 FK 引用。

如果您还从这两个外键中创建了一个复合主键,您还可以确保您的数据库中不会有任何重复的所有权。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多