Доступ к Room Database в MVVM
В примере от Google RecyclerViewFundamentals экземпляр DB мы получаем в "View" и передаем в ViewModel через ViewModelFactory:
class SleepTrackerFragment : Fragment() {
...
val dataSource = SleepDatabase.getInstance(application).sleepDatabaseDao
val viewModelFactory = SleepTrackerViewModelFactory(dataSource, application)
val sleepTrackerViewModel =
ViewModelProvider(
this, viewModelFactory).get(SleepTrackerViewModel::class.java)
...
}
class SleepTrackerViewModel(
dataSource: SleepDatabaseDao,
application: Application) : ViewModel() {
val database = dataSource
val nights = database.getAllNights()
}
Хотя паттерн MVVM предполагает доступ к "Model" во ViewModel. Помогите разобраться, можно ли создать dataSource во ViewModel или лучше использовать подход как в примере и почему?
Ответы (1 шт):
Это упрощённый пример + особенности платформы/библиотек.
Упрощённый, т.к. тут не используется DI (Toohpick, Dagger, Koin etc), который позволил бы получить все зависимости во ViewModel без их объявления во View.
Под особенностями платформы/библиотеки имеется в виду необходимость передачи Context в билдер БД. Context во ViewModel не доступен если не использовать DI или не прокинуть его туда вручную.
В принципе, т.к. во ViewModelFactory Context прокидывается и так, то можно сделать так, чтобы Dao создавался из БД не во врагменте, а там, где ViewModel создаётся, что убрало бы, отчасти, причину вашего вопроса, путём повышения субъективной сложности примера.