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

问题描述 投票:1回答:2

我需要你的帮助。我尝试找到没有反序列化的解决方案,但我没有发现任何东西。如果你可以帮助我会很好...所以我有以下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
2个回答
2
投票

房间在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。


0
投票

您的问题是您的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

希望这可以帮助 :)

© www.soinside.com 2019 - 2024. All rights reserved.