【问题标题】:Can't find proper relation and architecture saving data in ROOM在 ROOM 中找不到正确的关系和架构保存数据
【发布时间】:2020-10-02 05:46:54
【问题描述】:

我有一个这样的用户表

@Entity(tableName = "users")
    data class Users(
    @ColumnInfo(name = "id") @PrimaryKey val id: String,
    @ColumnInfo(name = "fullName") val fullName: String
    ...
 )

现在我有来自 REST 的事件信息

{
  "id": 1,
  "eventName": "Event name",
  ...
  "participantList": [
    {
      "userId": 1,
      "status": "going"
    },
    {
      "userId": 2,
      "status": "interested"
    }
  ]
}

如何将其保存在 Room 中以及实体和关系应该是什么,以便我可以拥有一个包含用户列表和每个用户状态的 Event 实体。例如

data class Event(
  val id:Int,
  val eventName: String,
  val participantList: List<UserWithStatus>
)

data class UserWithStatus(
  val user:User,
  val status:String
)

【问题讨论】:

  • 将 json 数据解析为对象.. 制作事件对象并将事件插入到 database.iniside DAO 类中,您应该有这样的查询 @Insert void insert(Event events);一旦你解析了 json 对象。比如 val event= response.body() mydatabase.eventdao().insert(event)
  • 我可以这样做,但问题是我可以从 REST 中获取用户 ID,我可以保存它但是当我查询它时,如何获取相关用户的用户信息的事件信息

标签: android kotlin retrofit android-room


【解决方案1】:

您的情况似乎应该使用nested relationships

尝试下一个架构(如果您愿意,可以添加外键):

实体

@Entity(tableName = "user")
data class User(
    @PrimaryKey var id: Int,
    var fullName: String
)

@Entity(tableName = "event")
data class Event(
    @PrimaryKey val id:Int,
    val eventName: String
)

@Entity(tableName = "event_details")
data class EventDetails(
    @PrimaryKey val id:Int,
    val eventId: Int, // make it Foreign Key if you want
    val userId: Int,  // make it Foreign Key if you want
    val status:String
)

辅助类

data class UserWithStatus(
    val userId:Int,
    val status: String,
    @Relation(
        entity = User::class,
        parentColumn = "userId",
        entityColumn = "id"
    )
    val user: User

)

data class EventWithUser(
    @Embedded
    val event: Event,
    @Relation(
        entity = EventDetails::class,
        parentColumn = "id",
        entityColumn = "eventId"
    )
    val participantList: List<UserWithStatus>
)

DAO

@Query("select * from event")
fun getEventsWithUsers(): List<EventWithUser>

【讨论】:

  • 感谢 sergiy 的回答。会尝试这样并让您知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多