Ошибка комнаты Android и вложенных отношений

У меня есть следующие 3 объекта:

@Entity(tableName = "PROPERTY",
    indices = [
        androidx.room.Index(value = ["id"], unique = true)
    ])
data class Property (
    @Expose @PrimaryKey override val id: UUID = UUID.randomUUID(),
    @SerializedName("type") @ColumnInfo(name = "type") val type: ItemPropertyType,
    @SerializedName("code") @ColumnInfo(name = "code") val code: String,
    @SerializedName("default_description") @ColumnInfo(name = "default_description") val defaultDescription: String?,
    @SerializedName("description_id") @ColumnInfo(name = "description_id") val descriptionId: UUID?,
    @SerializedName("default_property") @ColumnInfo(name = "default_property") val defaultProperty: Boolean,
    @SerializedName("entity") @ColumnInfo(name = "entity") val entity: String = "ITEM"
)

@Entity(tableName = "PROPERTY_SET_DETAIL",
    indices = [
        Index(value = ["id"], unique = true),
        Index(value = ["property_id"], unique = false)
    ],
    foreignKeys = [
        ForeignKey(entity = PropertySet::class, parentColumns = ["id"], childColumns = ["property_set_id"]),
        ForeignKey(entity = Property::class, parentColumns = ["id"], childColumns = ["property_id"])])
data class PropertySetDetail (
    @Expose @PrimaryKey override val id: UUID = UUID.randomUUID(),
    @SerializedName("property_id") @ColumnInfo(name = "property_id") val propertyId: UUID,
    @SerializedName("value") @ColumnInfo(name = "value") var value: String?,
    @SerializedName("rank") @ColumnInfo(name = "rank") val rank: Int,
    @SerializedName("property_set_id") @ColumnInfo(name = "property_set_id") val propertySetId: UUID
)

@Entity(tableName = "PROPERTY_SET",
    indices = [Index(value = ["id"], unique = true), Index(value = ["properties_charset"], unique = false), Index(value = ["hashkey"], unique = false)])
data class PropertySet (
    @Expose @PrimaryKey override val id: UUID = UUID.randomUUID(),
    @SerializedName("item_id") @ColumnInfo(name = "item_id") val itemId: UUID,
    @SerializedName("properties_charset") @ColumnInfo(name = "properties_charset") var propertiesCharset: String?,
    @SerializedName("hashkey") @ColumnInfo(name = "hashkey") var hashkey: String?,
)

а также следующие классы данных, которые мне нужны для вложенных отношений между тремя объектами, объявленными выше:

data class PropertySetAndDetails(
    @Embedded
    val set: PropertySet,

    @Relation(
        entity = PropertySetDetail::class,
        parentColumn = "id",
        entityColumn = "property_set_id"
    ) val details: List<PropertyDetailAndProperty>,
) 

data class PropertyDetailAndProperty(
    @Embedded
    val property: Property,

    @Relation(
        parentColumn = "id",
        entityColumn = "property_id"
    ) val detail: PropertySetDetail

)

и следующая функция запроса DAO:

@Transaction
@Query("select * from property_set where item_id = :itemId")
suspend fun getSetsForItem(itemId: UUID): List<PropertySetAndDetails>

Невозможно заставить его работать. Я получаю следующую ошибку сборки:

error: Возникла проблема с запросом: [SQLITE_ERROR] Ошибка SQL или отсутствует база данных (нет такого столбца: тип)

Я также объявил следующие функции преобразования для

ItemPropertyType:

@TypeConverter
    fun toItemPropertyType(v: Byte?): ItemPropertyType {
        return when (v) {
            null -> ItemPropertyType.Unknown
            else -> ItemPropertyType.getByValue(v)
        }
    }

    @TypeConverter
    fun fromItemPropertyType(t: ItemPropertyType?): Byte {
        return when (t) {
            null -> ItemPropertyType.Unknown.value
            else -> t.value
        }
    }

Может кто-нибудь объяснить мне, почему эти вложенные отношения не работают? Заранее спасибо.

0
0
536
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Пробовали ли вы использовать конвертер? Комната не может идентифицировать эти данные ("ItemPropertyType"). Вот почему вы получаете эту ошибку.

Док

Спасибо за быстрый ответ, но, к сожалению, да. Я также обновил пост с объявлениями преобразователя в конце. Любая другая идея?

Sergiob 17.12.2020 20:03

Я также пытался изменить тип типа на Int, но получаю ту же ошибку. Если я перемещаю тип в другую позицию (2-й столбец вместо первого), я получаю сообщение об ошибке в новом первом столбце, например: код

Sergiob 17.12.2020 20:09

Я думаю. Я обновлю этот комментарий, если у меня появится новая идея.

Arda Kazancı 17.12.2020 20:10

Хорошо, TX, просто чтобы добавить к деталям. Похоже, он не может связать значения свойства таблицы с набором результатов. По крайней мере так выглядит

Sergiob 17.12.2020 20:15

Почему в таблице PROPERTY SET нет значения «тип»?

Arda Kazancı 17.12.2020 20:16

Тип хранится в таблице свойств. В PROPERTY_SET в этом нет необходимости. PROPERTY_SET представляет заголовок для документа с большим количеством PROPERTY_SET_DETAIL, а PROPERTY содержит сведения о каждом PROPERTY_SET_DETAIL. Всегда существует PROPERTY для PROPERTY_SET_DETAIL, и для каждого набора PROPERTY_SET_DETAIL + PROPERTY существует родительский PROPERTY_SET. Надеюсь, я ясно выразился.

Sergiob 17.12.2020 20:27
Ответ принят как подходящий

Может кто-нибудь объяснить мне, почему эти вложенные отношения не работают?

Я не могу (назовем это магией комнаты), но я могу подсказать вам, как заставить это работать. Попробуйте изменить свой класс PropertyDetailAndProperty на это:

data class PropertyDetailAndProperty(
    @Embedded
    val detail: PropertySetDetail,

    @Relation(
        parentColumn = "property_id",
        entityColumn = "id"
    ) val property: Property
)

Кажется, что вложенный класс должен содержать объект, который вы используете во внешнем классе ( PropertySetDetail в вашем случае) за пределами @Relation. Почему? Ну, я думаю, это просто был дизайн разработчиков.

Большое спасибо ! Что странно, так это то, что я пробовал и это (но без очистки кеша, и это не сработало. Чем я очистил кеш, и с этого момента работало гладко. Было бы неплохо иметь более значимые ошибки компиляции из плагина Room- в... это сэкономит часы

Sergiob 18.12.2020 09:02

Другие вопросы по теме