android - 改造房间模型映射

标签 android mapping retrofit retrofit2 android-room

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

我有一个格式如下的 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/

相关文章:

java - Jackson 将子 JSON 反序列化为父属性

java - org.dozer.MappingException : No read or write method found for field

java - 在 Java 中存储三个属性条目集的最佳方法是什么?

android - 尝试运行我的应用程序时出现 "Unfortunately (my app) has Stopped"错误

java - 如何持久保存数据以便我可以离线使用它们

android - 如何获取设备的屏幕尺寸?

android studio 在 ubuntu 上经常挂起

android - 如何使用 Retrofit android 将 JSON 数据作为 Body 发送

java - Android 改造预计为 BEGIN_ARRAY

php - 将 RecyclerView 上传到 PHP 服务器 Android