gpt4 book ai didi

android - 改造房间模型映射

转载 作者:行者123 更新时间:2023-11-29 00:52:30 24 4
gpt4 key购买 nike

我有一个问题,对你们中的一些人来说可能很容易,但我真的无法解决。

我有一个格式如下的 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 级别,您使用 RestTransactionDbTransaction 进行操作,但将 Transaction 传递给 UI,以从其源代码中抽象出来。

关于android - 改造房间模型映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57903962/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com