Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android[Kotlin]-使用共享viewModel将新项目插入MasterDetail流上的选定子列表中_Android_Kotlin_Viewmodel_Android Room_Master Detail - Fatal编程技术网

Android[Kotlin]-使用共享viewModel将新项目插入MasterDetail流上的选定子列表中

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 (

我是android新手,我正在尝试遵循推荐的应用程序架构

该应用程序基本上由两个使用房间数据库的实体组成:培训和练习。它们具有多对多关系,如《android开发者指南》中建议的那样,通过一个额外的参考实体和一个POJO实现:

@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]) }
        })