房间中的多对多关系

时间:2018-09-10 11:53:02

标签: android kotlin android-room

我在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列表(列表)

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

1 个答案:

答案 0 :(得分:0)

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

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

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