У меня есть следующие 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
}
}
Может кто-нибудь объяснить мне, почему эти вложенные отношения не работают? Заранее спасибо.
Пробовали ли вы использовать конвертер? Комната не может идентифицировать эти данные ("ItemPropertyType"). Вот почему вы получаете эту ошибку.
Я также пытался изменить тип типа на Int, но получаю ту же ошибку. Если я перемещаю тип в другую позицию (2-й столбец вместо первого), я получаю сообщение об ошибке в новом первом столбце, например: код
Я думаю. Я обновлю этот комментарий, если у меня появится новая идея.
Хорошо, TX, просто чтобы добавить к деталям. Похоже, он не может связать значения свойства таблицы с набором результатов. По крайней мере так выглядит
Почему в таблице PROPERTY SET нет значения «тип»?
Тип хранится в таблице свойств. В PROPERTY_SET в этом нет необходимости. PROPERTY_SET представляет заголовок для документа с большим количеством PROPERTY_SET_DETAIL, а PROPERTY содержит сведения о каждом PROPERTY_SET_DETAIL. Всегда существует PROPERTY для PROPERTY_SET_DETAIL, и для каждого набора PROPERTY_SET_DETAIL + PROPERTY существует родительский PROPERTY_SET. Надеюсь, я ясно выразился.
Может кто-нибудь объяснить мне, почему эти вложенные отношения не работают?
Я не могу (назовем это магией комнаты), но я могу подсказать вам, как заставить это работать. Попробуйте изменить свой класс PropertyDetailAndProperty на это:
data class PropertyDetailAndProperty(
@Embedded
val detail: PropertySetDetail,
@Relation(
parentColumn = "property_id",
entityColumn = "id"
) val property: Property
)
Кажется, что вложенный класс должен содержать объект, который вы используете во внешнем классе ( PropertySetDetail в вашем случае) за пределами @Relation. Почему? Ну, я думаю, это просто был дизайн разработчиков.
Большое спасибо ! Что странно, так это то, что я пробовал и это (но без очистки кеша, и это не сработало. Чем я очистил кеш, и с этого момента работало гладко. Было бы неплохо иметь более значимые ошибки компиляции из плагина Room- в... это сэкономит часы
Спасибо за быстрый ответ, но, к сожалению, да. Я также обновил пост с объявлениями преобразователя в конце. Любая другая идея?