Как повторно получить 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
→ Ссылка