Цикл foreach выполняет лишь часть действий в корутине

В приложении пользуюсь Room для доступа к БД. Логика написана согласно мануалу гугла(MVVM). Возникла проблема с одной функцией в репозитории, которая почему-то сама останавливается. Код в ViewModel:

fun moveNotes(list: String) = viewModelScope.launch(Dispatchers.IO) {
    repository.moveNotes(TypeConverter.stringToListLong(list))
}

Код в репозитории:

suspend fun moveNotes(list: MutableList<Long>) {

    var note: Notes
    list.forEach {
        note = getNote(it)
        note.grouped = true
        notesDao.update(note) // ведет к suspend-функции в DAO
        if(!ids.contains(it)) {
            ids.add(it)
        }
    }
}

Итак, к проблеме. Спустя один-два цикла функция останавливается после строки notesDao.update(note)(3-ая строка цикла). Выяснил, что если если убрать ее из цикла, то цикл полностью отрабатывает. Сама по себе эта функция в DAO рабочая, в других функциях, а также без корутин работала. Код в DAO:

@Update
suspend fun update(notes: Notes)

Как думаете, в чем проблема?

UPD: Привязку к модели делаю так

var mainViewModel = ViewModelProvider(this).get(MainViewModel::class.java)

Ответы (1 шт):

Автор решения: IR42

Во ViewModelProvider передаётся тот компонент (ViewModelStoreOwner) из которого будет браться и к которому будет привязываться нужная вам ViewModel. У вас во фрагменте вы передаёте this, т.е. сам фрагмент как ViewModelStoreOwner, поэтому создаётся новая ViewModel и привязывается к этому фрагменту. При выходе из данного фрагмента ViewModel уничтожается, отменяя все корутины. Если во фрагменте нужно получить ViewModel из активити, то в ViewModelProvider нужно передавать активити.

mainViewModel = ViewModelProvider(requireActivity()).get(MainViewModel::class.java)
→ Ссылка