首页 > 解决方案 > 房间无法弄清楚如何将此字段保存到数据库中

问题描述

我需要你的帮助。我尝试在不反序列化的情况下找到解决方案,但我什么也没找到。如果您能帮助我,那就太好了...所以我有以下 JSON 文件

"resources": [{
    "id": 441988,
    "name": "TVA",
    "parent": {
      "id": 159
    },
  },
  {
    "id": 441900,
    "name": "Marketing",
    "parent": {
      "id": 166
    },
}]

我使用 ROOM 创建了一个数据库,它可以工作,但我有一个问题,它无法保存“父对象的 id”

这是我的以下代码:

    @Entity(tableName = "resources")
    class CategoryBean {

    @PrimaryKey
    @ColumnInfo(name = "resource_id")
    @SerializedName("id")
    private var mId: Int = 0

    @ColumnInfo(name = "name")
    @SerializedName("name")
    private var mName: String? = null

    @ColumnInfo(name = "parent")
    @SerializedName("parent")
    private var mParent: ParentBean? = null

    fun getId(): Int {
        return mId
    }

    fun getName(): String? {
        return mName
    }

    fun getParent(): ParentBean? {
        return mParent
    }

    fun setParent(parent: ParentBean) {
        mParent = parent
    }

    fun setId(id: Int) {
        mId = id
    }

    fun setName(name: String) {
        mName = name
    }

在这里你可以找到我的 ParentBean 文件

class ParentBean {

    @SerializedName("id")
    private var mId: Int = 0

    fun getId(): Int? {
        return mId
    }

}

我找到了一些列表的解决方案,但不是子对象。

感谢您的时间和帮助。

我有以下错误:

Cannot figure out how to save this field into database. You can consider adding a type converter for it.

标签: androidkotlinandroid-room

解决方案


Room 在 SQLite 数据库之上工作,当您@Entity在创建表时注释类时,该表的列是根据类的属性定义的,因此您不能直接存储自定义类型,如ParentBean,要做到这一点,您需要将属性注释mParent@Embedded

@Entity(tableName = "resources")
class CategoryBean constructor(
    @PrimaryKey
    @ColumnInfo(name = "resource_id")
    @SerializedName("id")
    var mId: Int,
    @ColumnInfo(name = "name")
    @SerializedName("name")
    var mName: String?,
    @SerializedName("parent")
    @Embedded
    var mParent: ParentBean?
)

然后为 中的属性定义一个列名ParentBean

data class ParentBean constructor(@SerializedName("id") @ColumnInfo(name = "parent_id")var mId: Int)

资源表将具有以下列:resource_id, name,parent_id

来源:https ://developer.android.com/training/data-storage/room/defining-data

注意:您不需要在 Kotlin 中手动定义 getter 和 setter。


推荐阅读