Как повторно получить LiveData из Room, но уже с другим id
У меня есть фрагмент и его viewmodel с репозиторием. Каждый раз, когда у меня меняется ID целей, я вызываю viewModel.initFocusGoal() чтобы получить новую LiveData из Room для новой цели.
Но он мне каждый раз возвращает null. Даже observe не срабатывает.
С чем это может быть связано? Может есть другие решения для этой задачи?
HomeFragment:
viewModel.initFocusGoal()
viewModel.getFocusGoal().observe(requireActivity(), {
println(it)
})
HomeViewModel:
var currentGoal: LiveData<Goal> = repository.currentGoal
fun getFocusGoal(): LiveData<Goal> {
return currentGoal
}
fun initFocusGoal() {
repository.initGoal(CURRENT_GOAL_ID)
}
HomeRepository:
var currentGoal: LiveData<Goal> = MutableLiveData()
fun initGoal(id: Long) {
currentGoal = goalDao.getLiveById(id)
}
GoalDao:
@Query("SELECT * FROM goal WHERE id = :id")
fun getLiveById(id: Long): LiveData<Goal>
Ответы (1 шт):
Автор решения: Wlad
→ Ссылка
Так делать не стоит.
У LiveData есть свой "адрес". И слушатели observe подписываются на этот "адрес". У вас же из БД возвращается новая LiveData с новым "адресом" и слушатели про него не знают.
Попробуйте изменить свой код на следующий
val currentGoal: LiveData<Goal> = MutableLiveData() // LiveData лучше делать VAL
// когда приходит ответ из БД, вам надо только поменять значение в LD, а не всю ее целиком (проблема с новым "адресом")
fun initGoal(id: Long) {
currentGoal.value = goalDao.getLiveById(id)
}
@Query("SELECT * FROM goal WHERE id = :id")
fun getLiveById(id: Long): Goal