Комната @ Relation возвращает только первый элемент таблицы - PullRequest
0 голосов
/ 23 октября 2019

Я использую Room в Android для своей базы данных, а также использую @Relation (на основании этого: https://developer.android.com/reference/android/arch/persistence/room/Relation.html) для извлечения данных из сущностей отношений, связанных один-ко-многим с помощью ForeinKey. Что яя пытаюсь получить это список с roomAreaNames от объекта RoomArea с помощью @Relation. В коде нет ошибок компиляции, проблема в том, что я получаю только ответ от @Relation - это список с размером 1 (только первый объект изтаблица), а не полный список.

Таблицы:

@Entity(
    tableName = "buildings_table",
    indices = [Index("contract_id")],
    foreignKeys = [
        ForeignKey(
            entity = Contract::class,
            parentColumns = ["contract_id"],
            childColumns = ["contract_id"],
            onDelete = ForeignKey.CASCADE)]
)
data class Building(
    @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "building_id")
    val buildingId: Long = 0L,

    @ColumnInfo(name = "contract_id")
    val contractId: Long,

    @ColumnInfo(name = "building_name")
    val buildingName: String)
@Entity(
    tableName = "floors_table",
    indices = [Index("building_id")],
    foreignKeys = [
        ForeignKey(
            entity = Building::class,
            parentColumns = ["building_id"],
            childColumns = ["building_id"],
            onDelete = ForeignKey.CASCADE)]
)
data class Floor(
    @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "floor_id")
    val floor_id: Long = 0L,

    @ColumnInfo(name = "building_id")
    val buildingId: Long,

    @ColumnInfo(name = "level")
    val level: Int
)
@Entity(
    tableName = "rooms_area_table",
    indices = [Index("floor_id")],
    foreignKeys = [
        ForeignKey(
            entity = Floor::class,
            parentColumns = ["floor_id"],
            childColumns = ["floor_id"],
            onDelete = ForeignKey.CASCADE)]
)
data class RoomArea(
    @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "room_area_id")
    val roomAreaId: Long = 0L,

    @ColumnInfo(name = "floor_id")
    val floorId: Long,

    @ColumnInfo(name = "room_area_name")
    val roomAreaName: String
)

Dao Query:

@Transaction
@Query("SELECT * FROM buildings_table WHERE contract_id = :contractId")
fun getItemsAuditBuilding(contractId: Long): LiveData<List<ItemAuditBuilding>>

Вот @Relation (дайте мне только размер списка 1) мне нужны все комнаты, связанные с buildingId

data class ItemAuditBuilding(

    @Embedded val building: Building,
    @Relation(
        parentColumn = "building_id",
        entityColumn = "room_area_id",
        entity = RoomArea::class,
        projection = ["room_area_name"]
    )
    var roomAreas: List<String>
)

Спасибо.

Ответы [ 2 ]

0 голосов
/ 27 октября 2019

Надеюсь, это поможет любому, кто пытается работать с @relation с Room. Я основал ответ на свой вопрос на Android Dev Summit 2019. Вот ссылка части, где Флорина говорит о комнате: [https://www.youtube.com/watch?v=_aJsh6P00c0]. На основе видео я внес следующие изменения:

Я добавил таблицу Junction:

@Entity(
    primaryKeys = ["building_id", "room_area_id"],
    indices = [Index("room_area_id")]
)
data class RoomAreaWithBuilding(
    @ColumnInfo(name = "building_id")
    val buildingId: Long,
    @ColumnInfo(name = "room_area_id")
    val roomAreaId: Long
)

Затем я изменил класс ItemAuditBuilding

data class ItemAuditBuilding(

    @Embedded val building: Building,

    @Relation(
        parentColumn = "building_id",
        entity = RoomArea::class,
        entityColumn = "room_area_id",
        projection = ["room_area_name"],
        associateBy = Junction(RoomAreaWithBuilding::class)
    )
    val roomAreas: List<String>
)

Примечание. Чтобы этот код работалВы должны быть в комнате 2.2, так как associateBy - это новая функция. Наслаждайтесь !!!

0 голосов
/ 23 октября 2019

Вы пытаетесь получить список строк. Я думаю, что вы на самом деле намеревались сделать это

data class ItemAuditBuilding(
@Embedded val building: Building,
@Relation(
    parentColumn = "building_id",
    entityColumn = "room_area_id",
    entity = RoomArea::class,
    projection = ["room_area_name"]
)
var roomAreas: List<RoomArea>

)

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