android - ROOM 无法弄清楚如何将此字段保存到数据库中

标签 android kotlin android-room

我需要你的帮助。 我试图在没有反序列化的情况下找到解决方案,但我什么也没找到。 如果你能帮助我就好了... 所以我有以下 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.

最佳答案

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_idnameparent_id

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

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

关于android - ROOM 无法弄清楚如何将此字段保存到数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55538271/

相关文章:

java - 将 ImageButton 设置为仅对其中一个列表组在 ExpandableListView 中可见

java - 将字符串日期与当前长时间进行比较

android - 检查房间中是否已存在对象

flutter - 禁用屏幕截图

reflection - 为什么 SomeClass::class 是 KClass<SomeClass> 但 this::class 是 KClass<out SomeClass>

android - R8 缩小 : Type defined multiple times

Android 房间错误 : TypeConverter not recognised for List of Enums

android - MySQL SELECT MAX() 查询

android - 在android中,哪一层代码处理多个RIL,例如3G 与 4G

java - 如何在 Firestore 中插入对象数组?