Странное поведение комнаты Android с идентификаторами в отношениях

#android #relationship #android-room

#Android #отношения #android-room

Вопрос:

Я замечаю что-то странное с Room. У меня есть два объекта: вино и бутылки Бутылка принадлежит только одному вину, но у вина может быть несколько бутылок (от одной до многих)

Итак, у меня есть следующая модель:

 @Entity(tableName = "wine")
data class Wine(
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "id_wine")
    val idWine: Long = 0,
    val name: String
)

@Entity(tableName = "bottle")
data class Bottle(
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "id_bottle")
    val idBottle: Long = 0,
    @ColumnInfo(name = "id_wine") val idWine: Long,
    val comment: String
)
  

Отношение:

 data class WineWithBottles (
    @Embedded val wine: Wine,
    @Relation(
        parentColumn = "id_wine",
        entityColumn = "id_bottle"
    )
    val bottles: List<Bottle>
)
  

И, наконец, в комнате базы данных выполняется предварительный обратный вызов:

 private val roomCallback: Callback = object : RoomDatabase.Callback() {
            override fun onCreate(db: SupportSQLiteDatabase) {
                super.onCreate(db)
                thread {
                    val bottleDao = instance?.bottleDao()
                    val wineDao = instance?.wineDao()

                    wineDao?.insertWine(Wine(1, "a"))
                    wineDao?.insertWine(Wine(2, "a"))
                    wineDao?.insertWine(Wine(3, "a"))

                    bottleDao?.insertBottle(Bottle(0, 1, a))
                    bottleDao?.insertBottle(Bottle(0, 1, b))
                    bottleDao?.insertBottle(Bottle(0, 1, c))

                }
            }
        }
  

Я упоминаю, что я предоставляю объекты Wine и Bottles в аннотации Room @ Database

Итак, проблема в том, что когда я наблюдаю getAllBottles() : LiveData<List<Bottle>> , я получаю все бутылки, все в порядке

Но когда я наблюдаю getWineWithBottles(): LiveData<List<WineWithBottles>> , у меня есть одна бутылка на вино, хотя я установил id_wine для всех бутылок равным 1

У каждого объекта WineWithBottles есть вино и ОДНА бутылка в списке: [WineWithBottles(вино = Вино(idWine= 1, name = a), бутылки=[Бутылка(idBottle=1, idWine= 1, комментарий = a)]), WineWithBottles(вино= Вино(idWine= 2, name = a), бутылки =[Бутылка(idBottle=2, idWine = 1, комментарий = b)]) , WineWithBottles(вино=Вино(idWine=3, название =a), бутылки=[Бутылка(idBottle=3, idWine=1, комментарий=c)])]

Ответ №1:

Попробуйте изменить условие отношения на wine.id_wine=bottle.id_wine :

 data class WineWithBottles (
    @Embedded val wine: Wine,
    @Relation(
        parentColumn = "id_wine",
        entityColumn = "id_wine"
    )
    val bottles: List<Bottle>
)
  

Комментарии:

1. Такая глупая ошибка, я запутался с атрибутами, Спасибо, что указали на это 🙂