android - 与 Android Room 有很多关系的实体

标签 android android-room android-architecture-components

我正在尝试使用新的 Android Architecture Components 来更新我的 Android 知识。 。我正在研究如何使用 Room 保存数据,但如果你实际上有 relational data ,它似乎几乎无法使用我希望您能帮助我理解我错过的一些事情,或者确认 Room 确实不适用于任何类型的严肃关系数据。

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

我有一个针对动物饲养员的应用程序,并且我有一个 Animal实体。假设我有一个 Weight记录动物在给定日期的体重的实体。安AnimalWeight 有一对多关系创建一段时间以来他们体重的历史记录。

根据 Room 培训文档,我需要创建一个名为 AnimalWithWeights 的第三类。像:

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例如父亲、母亲、代孕母亲、繁殖伙伴以及与其他实体类型的关系,例如 Breed , Breeder , Buyer , DNA ,以及 Weights 的多对多关系, Notes , MedicalTreatments , MatingRecords , Ultrasounds

除非我遗漏了一些东西,否则听起来我需要创建一个类 AnimalWithWeights然后将其包装在名为 AnimalWithWeightsAndNotes 的第四类中

并将其包装在名为 AnimalWithWeightsAndNotesAndMedicalTreatments 的第五类中

并将其包装在名为 AnimalWithWeightsAndNotesAndMedicalTreatmentsAndMatingRecords 的第六类中

并将其包装在名为 AnimalWithWeightsAndNotesAndMedicalTreatmentsAndMatingRecordsAndUltrasounds 的第七类中...

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

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

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

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

最佳答案

从您的帖子中不清楚您是否知道在提到的辅助第三类中链接多个 @Relation 的可能性。从技术上讲,由于 Animal 与其他实体具有一对多和一对一的关系,因此您只需添加一个最终类 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房间设置跟踪器以通知观察者体重的任何变化、注释等等。

但我怀疑通过这种结构,您是否可以获得例如父亲母亲的体重、笔记等。

关于android - 与 Android Room 有很多关系的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64356315/

相关文章:

android - Jetpack 与 RxJava2 和 Realm 组合

android - 如何以编程方式将 TextView 更改为 ImageView 并返回

android - 如何在存储库类MVVM中使用Firebase身份验证监听器?

android - 是否可以在没有Factory的情况下在公共(public)方法中将id参数传递给AndroidViewModel?

java - 无法发送自动短信

java - 在 Android 的 OpenGL View 之上播放视频

安卓房间。哪种插入方法会更快?

java - Android Room 插入所有问题

android - 使用 INNER JOIN 删除 Room 中的数据?

java.lang.IllegalArgumentException : This source was already added with the different observer 异常