我在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解决,或者是否有任何简单的替代方法来实现这一目标。
答案 0 :(得分:0)
通过在两个现有表之间创建一个新表并为该新创建的表创建两个1:N关系来解决多对多关系。
示例: 一个人可以拥有许多汽车,而一辆汽车可以由许多人拥有。要解决这种多对多关系,您可以创建一个所有者表,该表包含对Person PK的FK引用和对Car PK的FK引用。
如果您还从这两个外键中创建一个复合主键,则还要确保数据库中不会有任何重复的所有权。