【问题标题】:Entity with lots of relationships with Android Room与 Android Room 有很多关系的实体
【发布时间】:2020-10-14 15:09:47
【问题描述】:

我正在尝试使用新的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&lt;AnimalWithWeights&gt;

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

但我的关系不止一种。

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

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

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

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

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

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

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

我错过了 Room 的内容吗?

我希望能够使用一些新功能,例如 LiveData&lt;&gt;,这样我就可以在我的数据更新时获得自动回调,这也是我研究 Room 的原因之一,但似乎过于简陋,无法处理现实的关系数据模型。

【问题讨论】:

  • 这没有意义...对于前显示列表,您只需要来自 Animal 表的 fx 数据...如果您显示详细信息,则可以为此添加方法,例如 loadWeightsForAnimal(animalid) .. . 一次加载全部信息需要时间并“吃掉”资源
  • 即使抛开对多关系,在视图屏幕上,我需要能够显示父亲的名字,母亲的名字,代母的名字,繁殖伙伴的名字,品种名,饲养员名,买家姓名、DNA 姓名(以及我在示例中遗漏的更多关系),所以我仍然需要 ...AndFatherAndMotherAndSurrogateMotherAndBreedingParterAndBreedAndBreederAndBuyerAndDNA...

标签: android android-room android-architecture-components


【解决方案1】:

从您的帖子中不清楚您是否知道在提到的辅助第三类中链接多个@Relations 的可能性。从技术上讲,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 Room 都会在内部调用单独的查询,如果您使用 LiveData Room 设置跟踪器以通知观察者WeightNotes 等的任何变化。

我怀疑通过这种结构你可以得到例如fathermother 的重量、注释等等。

【讨论】:

  • 好的,这确实有点帮助,我所见过的博客上的文档或示例都没有显示出结合所有这些东西的能力。我发现的一个博客示例确实谈到了多重关系,确实确实使用了这个和这个以及这个和这个的疯狂组合。甚至文档将UserWithPlaylistsAndSongs 引用为其中两个数据类的组合。好的,我会考虑一下。谢谢。
  • 好吧,如果你的 Note 类与另一个类 X 有关系,并且该类与 Y 类有另一个关系并且你想进入你的AnimalWithAllStuff 类所有这些对象的包装层次结构。在 Rom 的官方文档中称为nested relations。那么你真的需要不断地包装。正如我从您的帖子中了解到的那样,这不是您的情况。
猜你喜欢
  • 2017-11-23
  • 2018-06-23
  • 1970-01-01
  • 2020-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多