(Android -room-library) Как реализовать дублированный внутренний класс? - PullRequest
0 голосов
/ 12 февраля 2020

Иерархия данных:

  1. Место
    • идентификатор
    • имя
    • изображения
      • original_image
        • id
        • image_url
        • ширина
        • высота
      • thumbnail_image
        • id
        • image_url
        • ширина
        • высота

original_image равно thumbnail_image.

Итак, класс My Place -

@Entity
class PlaceEntity(.....) {
    @PrimaryKey
    var id: Int = id

    var name: String = name

    @Embedded
    var images: Images = images
}

И класс My Images -

class Images(.....) {
    @Relation(parentColumn = "origin_id", entityColumn = "id")
    var original: Image = original

    @Relation(parentColumn = "thumb_id", entityColumn = "id")
    var thumbnail: Image = thumbnail
}

И, наконец, класс My Image -

class Image(.....) {
    var id: Int = id
    var url: String = url
    var width: Int = width
    var height: Int = height
}

Но, когда Я скомпилировал этот проект, библиотека комнаты возвращает ошибку

ошибка: не удается найти столбец родительской сущности origin_id в com.test.room.entity.Images. Параметры: private com.test.room.entity.Image original;

ошибка: не удается найти столбец родительской сущности thumb_id в com.test.room.entity.Images. Опции: private com.test.room.entity.Image thumbnail;

error: сущности и POJO должны иметь пригодный для использования конструктор publi c. Вы можете иметь пустой конструктор или конструктор, параметры которого соответствуют полям (по имени и типу). publi c final class Images {^

Как я могу решить эту проблему .. сэр ..?

Пожалуйста, помогите мне ..

Спасибо и счастливого нового года !!

Ответы [ 3 ]

0 голосов
/ 12 февраля 2020

Если вы не указали конкретно имя столбца, ROOM назначает имя столбца, такое же, как имя переменной при создании таблиц.

В вашем случае вы должны указать аннотацию родительского класса @ColumnInfo(name=""), чтобы указать имя столбца таблицы, которое должно отличаться от имени переменной.

Итак, PlaceEntity будет

@Entity
class PlaceEntity(.....) {
    @PrimaryKey
    @ColumnInfo(name="place_id") // Add this to determine column name
    var id: Int = id

    var name: String = name

    @Embedded
    var images: Images = images
}

По отношению Images класс является дочерним для PlaceEntity, parentColumn должно быть place_id в вашем случае.

class Images(.....) {
    @Relation(parentColumn = "place_id", entityColumn = "id") // Parent column should be 'place_id'
    var original: Image = original

    @Relation(parentColumn = "place_id", entityColumn = "id")
    var thumbnail: Image = thumbnail
}
0 голосов
/ 12 февраля 2020

Спасибо за все ответы.

Я нашел решение этого вопроса.

Вот мои занятия.

@Entity
class PlaceEntity(.....) {
    @PrimaryKey
    var id: Int = id

    var name: String = name

    @Embedded(prefix = "imgs_")
    var images: Images = images
}


class Images(.....) {
    @Embedded(prefix = "origin_")
    var original: Image = original

    @Embedded(prefix = "thumbs_")
    var thumbnail: Image = thumbnail
}

Еще раз спасибо за все ответы!

0 голосов
/ 12 февраля 2020

Используйте свой класс «Изображения» как Entity, как «PlaceEntity».

...