与 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
实体,它记录了动物在给定日期的体重。 Animal
与 Weight
具有一对多关系,以创建他们随时间变化的体重历史记录。
根据 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
有关系,如父亲、母亲、代孕母亲、育种伙伴,以及与其他实体类型的关系,如 Breed
、Breeder
、Buyer
、DNA
和 Weights
、Notes
、MedicalTreatments
、MatingRecords
、Ultrasounds
等的对多关系.
除非我遗漏了什么,否则听起来我需要创建一个 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
房间设置跟踪器以通知观察者 Weight
、Notes
等的任何变化上。
我怀疑使用那个结构你可以得到,例如,father
和 mother
的重量、注释等等。
我正在尝试用新的 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
实体,它记录了动物在给定日期的体重。 Animal
与 Weight
具有一对多关系,以创建他们随时间变化的体重历史记录。
根据 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
有关系,如父亲、母亲、代孕母亲、育种伙伴,以及与其他实体类型的关系,如 Breed
、Breeder
、Buyer
、DNA
和 Weights
、Notes
、MedicalTreatments
、MatingRecords
、Ultrasounds
等的对多关系.
除非我遗漏了什么,否则听起来我需要创建一个 class,即 AnimalWithWeights
,然后将其包装在名为 AnimalWithWeightsAndNotes
的第 4 个 class 中
并将其包装在名为 AnimalWithWeightsAndNotesAndMedicalTreatments
并将其包装在第 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
房间设置跟踪器以通知观察者 Weight
、Notes
等的任何变化上。
我怀疑使用那个结构你可以得到,例如,father
和 mother
的重量、注释等等。