【发布时间】:2020-10-14 15:09:47
【问题描述】:
我正在尝试使用新的Android Architecture Components 更新我的 Android 知识。我正在研究如何使用Room 持久化数据,但如果您实际上拥有relational data,它似乎几乎无法使用,我希望您能帮助我理解我错过的一些事情或确认 Room 真的没有不适用于任何类型的严肃关系数据。
这是我能提供的最简单的问题。
我有一个动物饲养员的应用程序,我有一个Animal 实体。假设我有一个Weight 实体,它记录了动物在给定日期的重量。 Animal 与 Weight 具有一对多关系,以创建它们随时间变化的重量的历史记录。
根据 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 的第 5 类中
并将其包装在名为 AnimalWithWeightsAndNotesAndMedicalTreatmentsAndMatingRecords 的第 6 类中
并将其包装在名为 AnimalWithWeightsAndNotesAndMedicalTreatmentsAndMatingRecordsAndUltrasounds...的第 7 类中...
我什至还没到...AndFatherAndMotherAndSurrogateMotherAndBreedingParterAndBreedAndBreederAndBuyerAndDNA....
我目前正在使用ORMLite 来处理我的 sqlite 持久性,它可以很好地处理关系数据,但似乎 Room 只是为了处理平面数据而设计的。
我错过了 Room 的内容吗?
我希望能够使用一些新功能,例如 LiveData<>,这样我就可以在我的数据更新时获得自动回调,这也是我研究 Room 的原因之一,但似乎过于简陋,无法处理现实的关系数据模型。
【问题讨论】:
-
这没有意义...对于前显示列表,您只需要来自 Animal 表的 fx 数据...如果您显示详细信息,则可以为此添加方法,例如
loadWeightsForAnimal(animalid).. . 一次加载全部信息需要时间并“吃掉”资源 -
即使抛开对多关系,在视图屏幕上,我需要能够显示父亲的名字,母亲的名字,代母的名字,繁殖伙伴的名字,品种名,饲养员名,买家姓名、DNA 姓名(以及我在示例中遗漏的更多关系),所以我仍然需要
...AndFatherAndMotherAndSurrogateMotherAndBreedingParterAndBreedAndBreederAndBuyerAndDNA...
标签: android android-room android-architecture-components