【问题标题】:ROOM Cannot figure out how to save this field into database房间无法弄清楚如何将此字段保存到数据库中
【发布时间】:2019-04-05 14:59:13
【问题描述】:

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

【问题讨论】:

    标签: android kotlin android-room


    【解决方案1】:

    Room 在 SQLite 数据库之上工作,当您将类注释为 @Entity 时,您正在创建一个表,其列是根据类的属性定义的,因此您不能直接存储像 @ 这样的自定义类型987654323@,为此,您需要将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。

    【讨论】:

    • 它有效,感谢您的链接。有时 parent 可以为空。所以我有以下代码:@Embedded @SerializedName("parent") private var mParent: ParentBean? = null 你知道为什么我会出现以下错误:指定为非 null 的参数为 null:方法 kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull,参数父
    • @AlainProfessional 那么您需要在ParentBean 数据类中将var mId: Int 更改为var mId: Int?
    • 哦,好的,谢谢,顺便说一句,通过更改为数据类,它解决了问题,但谢谢@glisu
    【解决方案2】:

    您的问题是您的 JSON 数据无效。

    "resources": [{
      "id": 441988,
      "name": "TVA",
      "parent": {
        "id": 159
      },            //This Line has a comma without another field following it
    },
    {
      "id": 441900,
      "name": "Marketing",
      "parent": {
        "id": 166
      },           //This Line has a comma without another field following it
    }]
    

    整个东西也应该被另一组花括号包围(但我假设由于复制和粘贴而被遗漏了)。

    这个网站是测试 JSON 数据和 POJO 的好工具:http://www.jsonschema2pojo.org

    希望这会有所帮助:)

    【讨论】:

    • 很抱歉,因为我没有正确复制粘贴 Json。我只是删除了一些无用的行,那为什么它不正确
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 2017-11-18
    相关资源
    最近更新 更多