我有一个问题,对你们中的一些人来说可能很容易,但我真的无法解决。
我有一个格式如下的 json:
{
"id" : "1641S818",
"balance" : "100.20",
"transactions" : [
{
"id" : "item1",
"price" : "1.50",
"description" : "pen",
"date" : "2018-05-14T14:19:00Z"
},
{
"id" : "item1",
"price" : "9.00",
"description" : "book",
"date" : "2018-05-14T08:19:00Z"
}
]
}
我第一次想尝试使用 Retrofit + Room 构建应用程序,但在构建模型时遇到了问题。
我为 Retrofit 想出了这个数据类,它们工作正常。这并不奇怪,因为我知道如何使用它。
data class Account (
val id : String,
val balance : Double,
val transactions : List<Transaction>
)
data class Transaction (
val id : String,
val price : Double,
val description : String,
val date : String
)
当我想将这个结构保存在数据库中时,真正的问题就开始了,账户和交易之间存在这种一对多的关系。到目前为止,我了解到 Room 无法处理这种类型的结构,我应该为数据库模型构建不同的类。所以我做了:
@Entity(tableName = "account")
data class AccountData(
@ColumnInfo(name = "id")
@PrimaryKey(autoGenerate = false)
val id: String,
val balance: Double,
)
@Entity(
tableName = "transaction",
foreignKeys = [
ForeignKey(
entity = AccountData::class,
parentColumns = ["id"],
childColumns = ["account_id"],
onUpdate = ForeignKey.CASCADE,
onDelete = ForeignKey.CASCADE
)
]
)
data class TransactionData(
@PrimaryKey(autoGenerate = false)
@ColumnInfo(name = "id")
val transactionId: String,
@ColumnInfo(name = "account_id")
val accountId: String,
val price: Double,
val description: String,
val date: String
)
现在是我卡住的部分。我找不到指南,示例,任何显示在这种特殊情况下使用映射器(可能使用 livedata 或 rx)转换模型的地方,这是当我们在对象之间存在复杂关系而不仅仅是普通类时。
最佳答案
你可以像这样用扩展函数定义单独的Mapper文件
fun Transaction.toTransactionData() = TransactionData(...)
然后在 API 调用之后,可能在 UseCase 中,您可以使用此函数将您的 API 实体映射到 DB 实体,然后将结果传递给 Room dao。
更新 1。
此外,您可以为 UI 使用定义 Transation
实体。因此,在 UseCase 级别,您使用 RestTransaction
和 DbTransaction
进行操作,但将 Transaction
传递给 UI,以从其源代码中抽象出来。
关于android - 改造房间模型映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57903962/