与 Android 房间有很多关系的实体

Entity with lots of relationships with Android Room

我正在尝试用新的 Android Architecture Components. I'm looking at how to persist data with Room, but it seems like it is practically unusable if you actually have relational data 更新我的 Android 知识,我希望你能帮助我理解我遗漏的东西,或者确认 Room 真的不起作用对于任何类型的严肃关系数据。

这是我能提供的尽可能小的问题。

我有一个动物饲养员的应用程序,我有一个 Animal 实体。假设我有一个 Weight 实体,它记录了动物在给定日期的体重。 AnimalWeight 具有一对多关系,以创建他们随时间变化的体重历史记录。

根据 Room 培训文档,我需要创建一个名为 AnimalWithWeights 的第三个 class,例如:

data class AnimalWithWeights(
    @Embedded val Animal: Animal,
    @Relation(
          parentColumn = "AnimalId",
          entityColumn = "AnimalId"
    )
    val Weights: List<Weight>
)

并向我的 DAO 添加一个函数,例如 fun getAnimalsWithWeights(): List<AnimalWithWeights>

@Transaction
@Query("SELECT * FROM Animal")
fun getAnimalsWithWeights(): List<AnimalWithWeights>

但我不只有一种关系。

我的 Animal 实体与其他 Animals 有关系,如父亲、母亲、代孕母亲、育种伙伴,以及与其他实体类型的关系,如 BreedBreederBuyerDNAWeightsNotesMedicalTreatmentsMatingRecordsUltrasounds 等的对多关系.

除非我遗漏了什么,否则听起来我需要创建一个 class,即 AnimalWithWeights,然后将其包装在名为 AnimalWithWeightsAndNotes 的第 4 个 class 中

并将其包装在名为 AnimalWithWeightsAndNotesAndMedicalTreatments

的第 5 个 class 中

并将其包装在第 6 个 class 中,称为 AnimalWithWeightsAndNotesAndMedicalTreatmentsAndMatingRecords

并将其包装在第 7 个 class 中,称为 AnimalWithWeightsAndNotesAndMedicalTreatmentsAndMatingRecordsAndUltrasounds...

我什至还没到 ...AndFatherAndMotherAndSurrogateMotherAndBreedingParterAndBreedAndBreederAndBuyerAndDNA....

我目前正在使用 ORMLite 来处理我的 sqlite 持久性并且它可以很好地处理关系数据,但似乎 Room 只是真正设计用于处理平面数据。

我是否遗漏了 Room 的某些内容?

我希望能够使用 LiveData<> 等一些新功能,以便在我的数据更新时获得自动回调,这也是我研究 Room 的原因之一,但它似乎太简陋了,无法处理现实的关系数据模型。

从你的 post 中不清楚你是否意识到在提到的辅助第三 class 中 link 几个 @Relation 的可能性。 Animal 在技术上与其他实体有 one-to-many 和 one-to-one 关系,您只需要添加一个最终的 class AnimalWithAllStuff:

data class AnimalWithAllStuff(
    @Embedded val Animal: Animal,
    @Relation(
          parentColumn = "AnimalId",
          entityColumn = "AnimalId"
    )
    val weights: List<Weight>,
    @Relation(
          parentColumn = "AnimalId",
          entityColumn = "AnimalId"
    )
    val notes: List<Notes>,
    ....
    @Relation(
          parentColumn = "fatherId",
          entityColumn = "AnimalId"
    )
    val father: Animal,
    @Relation(
          parentColumn = "motherId",
          entityColumn = "AnimalId"
    )
    val mother: Animal,
    ....
)

从技术上讲,每个 @Relation 房间在内部调用单独的查询,如果您使用 LiveData 房间设置跟踪器以通知观察者 WeightNotes 等的任何变化上。

我怀疑使用那个结构你可以得到,例如,fathermother 的重量、注释等等。