莫氏与房间——映射关系
Moshi and room - mapping relationships
我有 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 映射关系?您找到该问题的最简单解决方案了吗?
我认为你有 2 个选择。
- 您将组和用户拆分到单独的表中并分别插入。
- 您使用
TypeConverters
将成员存储为组字段。
您的实施将取决于您的用例。
- 您使用
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
)
最后,我用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 并将用户存储在其他地方,但我喜欢这个解决方案是如此简单。
我有 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 映射关系?您找到该问题的最简单解决方案了吗?
我认为你有 2 个选择。
- 您将组和用户拆分到单独的表中并分别插入。
- 您使用
TypeConverters
将成员存储为组字段。
您的实施将取决于您的用例。
- 您使用
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
)
最后,我用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 并将用户存储在其他地方,但我喜欢这个解决方案是如此简单。