Android[Kotlin]-使用共享viewModel将新项目插入MasterDetail流上的选定子列表中
我是android新手,我正在尝试遵循推荐的应用程序架构 该应用程序基本上由两个使用房间数据库的实体组成:培训和练习。它们具有多对多关系,如《android开发者指南》中建议的那样,通过一个额外的参考实体和一个POJO实现:Android[Kotlin]-使用共享viewModel将新项目插入MasterDetail流上的选定子列表中,android,kotlin,viewmodel,android-room,master-detail,Android,Kotlin,Viewmodel,Android Room,Master Detail,我是android新手,我正在尝试遵循推荐的应用程序架构 该应用程序基本上由两个使用房间数据库的实体组成:培训和练习。它们具有多对多关系,如《android开发者指南》中建议的那样,通过一个额外的参考实体和一个POJO实现: @Entity( tableName = "training_exercise_ref", primaryKeys = ["trainingId", "exerciseId"]) data class TrainingExerciseCrossRef (
@Entity(
tableName = "training_exercise_ref",
primaryKeys = ["trainingId", "exerciseId"])
data class TrainingExerciseCrossRef (
var trainingId: Long,
var exerciseId: Long
)
data class TrainingWithExercise (
@Embedded val training: Training,
@Nullable
@Relation(
parentColumn = "trainingId",
entityColumn = "exerciseId",
associateBy = Junction(TrainingExerciseCrossRef::class)
)
val exercises: List<Exercise>?
并在细节片段中显示所选训练和练习列表。
在细节片段中,我还希望能够插入新的练习
我的问题来了:添加新练习时,我使用上面的“insertExerciseToTraining”函数,然后在存储库中插入练习和新的trainingExerciseCrossRef。 但是在细节片段中,练习列表没有得到更新。仅当我返回到培训概述并再次选择培训时。 这是使用共享视图模型进行此操作的正确方法吗?
作为一个快速修复,我只在viewModel中共享培训id,并再次从DB中查询trainingWithExercise,观察并显示它。然后,在插入新练习时,列表将正确更新。但这似乎不是实现我的目标的最佳方式,也不是使用viewModels的最佳方式。
有什么建议吗?我想出了一个解决办法,但我不确定这是否是最佳做法。也许有更干净的方法;但它起作用了 因此,基本上,如上所述,我正在选择训练,并将选择的id保存到viewModel中。然后,我启动详细信息片段,观察完整的allTrainingWithExercise List/LiveData,然后使用先前保存的id筛选此列表以进行培训,并在视图中进行设置。
因此,当我通过插入新练习来更新培训的练习列表时,观察到的allTrainingsWithExercise将更新,并且我将根据保存的培训id“重新选择”培训
dashboardViewModel.allTrainingWithExercises.observe(viewLifecycleOwner, Observer { trainings ->
trainings?.let { adapter.setTraining(it.filter { it.training.trainingId == dashboardViewModel.selectedTrainingId }[0]) }
})
dashboardViewModel.selectedTraining.observe(viewLifecycleOwner, Observer { exercises ->
exercises?.let { adapter.setTraining(it) }
})
dashboardViewModel.allTrainingWithExercises.observe(viewLifecycleOwner, Observer { trainings ->
trainings?.let { adapter.setTraining(it.filter { it.training.trainingId == dashboardViewModel.selectedTrainingId }[0]) }
})