【问题标题】:Moshi and room - mapping relationshipsMoshi 和房间映射关系
【发布时间】:2020-07-16 11:24:30
【问题描述】:

我有那个Json,我想用Moshi 映射并用Room 存储

{
    "name": "My Group",
    "members": [
        {
            "id": "119075",
            "invitedUser": {
                "id": 97375,
                "email": "xxx@gmail.com"
            },
            "inviting_user": {
                "id": 323915,
                "email": "yyy@gmail.com"
            }
        },
        {
            "id": "395387",
            "invitedUser": {
                "id": 323915,
                "email": "aaa@gmail.com"
            },
            "inviting_user": {
                "id": 323915,
                "email": "bbb",
            }
        }
    ]
}

我准备了我的模型

@Entity(tableName = "groups")
data class Group(
    @PrimaryKey
    val id: Long,
    val members: List<Member>
)

@Entity(tableName = "members")
data class Member(
    @PrimaryKey
    val id: Long,

    @Json(name = "invited_user")
    @ColumnInfo(name = "invited_user")
    val invitedUser: User,

    @Json(name = "inviting_user")
    @ColumnInfo(name = "inviting_user")
    val invitingUser: User
)

@Entity(tableName = "users")
data class User(
    @PrimaryKey
    val id: Int,

    val email: String
)

目前,我有error: Cannot figure out how to save this field into database. 我读了这个https://developer.android.com/training/data-storage/room/relationships。但是,如果我要像文档中那样对关系进行建模,我不知道如何让 Moshi 映射关系?您找到解决该问题的最简单方法了吗?

【问题讨论】:

    标签: android android-room moshi android-room-relation


    【解决方案1】:

    在我看来,你有两个选择。

    1. 您将组和用户拆分到单独的表中并分别插入。
    2. 您使用TypeConverters 将成员存储为组字段。

    您的实施将取决于您的用例。

    【讨论】:

      【解决方案2】:
      1. 您使用TypeConverters 将成员存储为组字段。

      我相信这是您需要的实现。

      open class UserRequestConverter {
      
          private val moshi = Moshi.Builder().build()
      
          @TypeConverter
          fun fromJson(string: String): User? {
              if (TextUtils.isEmpty(string))
                  return null
      
              val jsonAdapter = moshi.adapter(User::class.java)
              return jsonAdapter.fromJson(string)
          }
      
          @TypeConverter
          fun toJson(user: User): String {
              val jsonAdapter = moshi.adapter(User::class.java)
              return jsonAdapter.toJson(user)
          }
      }
      
      
      
      @Entity(tableName = "members")
      data class Member(
          @PrimaryKey
          val id: Long,
      
          @Json(name = "invited_user")
          @ColumnInfo(name = "invited_user")
          @TypeConverters(UserRequestConverter::class)
          val invitedUser: User,
      
          @Json(name = "inviting_user")
          @ColumnInfo(name = "inviting_user")
          @TypeConverters(UserRequestConverter::class)
          val invitingUser: User
      )
      

      【讨论】:

      • 公平地说,我不明白您为什么要进行用户映射?我不应该像下面写的那样映射List&lt;Member&gt;吗?
      【解决方案3】:

      最后,我使用TypeConverters存储了它

      private val membersType = Types.newParameterizedType(List::class.java, Member::class.java)
      private val membersAdapter = moshi.adapter<List<Member>>(membersType)
      
      @TypeConverter
      fun stringToMembers(string: String): List<Member> {
          return membersAdapter.fromJson(string).orEmpty()
      }
      
      @TypeConverter
      fun membersToString(members: List<Member>): String {
          return membersAdapter.toJson(members)
      }
      

      那是我的模型

      @TypeConverters(Converters::class)
      @Entity(tableName = "groups")
      data class Group(
          @PrimaryKey
          val id: Long,
          val name: String
      ) {
          companion object {
      
              data class Member(
                  val id: Long,
                  val invitedUser: User,
                  val invitingUser: User
              )
      
              data class User(
                  val id: Long,
                  val email: String
              )
          }
      }
      

      你觉得好看吗? 可能更干净的是只有 id 并将用户存储在其他地方,但我喜欢这个解决方案非常简单。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-03
        • 1970-01-01
        相关资源
        最近更新 更多