ROOM Не могу понять, как сохранить это поле в базе данных - PullRequest
1 голос
/ 05 апреля 2019

Мне нужна твоя помощь. Я пытаюсь найти решение без десериализации, но ничего не нашел. Было бы хорошо, если бы вы могли мне помочь ... Итак, у меня есть следующий файл JSON

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

Я использовал ROOM для создания базы данных, она работает, но у меня есть одна проблема, невозможно сохранить «идентификатор родительского объекта»

вот мой следующий код:

    @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.

Ответы [ 2 ]

2 голосов
/ 05 апреля 2019

Комната работает поверх базы данных 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)
*Таблица ресурсов 1011 * будет иметь следующие столбцы: resource_id, name, parent_id

источник: https://developer.android.com/training/data-storage/room/defining-data

Примечание. Вам не нужно вручную определять метод получения исеттеры в Котлине.

0 голосов
/ 05 апреля 2019

Ваша проблема в том, что ваши данные 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

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...