У меня есть два занятия.Первое действие показывает список заметок.Notes
сами являются списками.Я использую компоненты архитектуры Android: ViewModel, LiveData;с помощью Repository, Room, Dao и т. д. Итак, я создаю метод getAllNotes()
в Dao, Repository и ViewModel, как в примерах приложений Google.В onCreate
методе первого действия я вызываю observe
и устанавливаю содержимое адаптера в RecyclerView.И работает нормально - показывает список с Note
заголовками.Вот так:
override fun onCreate(savedInstanceState: Bundle?) {
//some code
viewModel = obtainViewModel()
viewModel.getAllNotes().observe(this, Observer<List<Notes>> { notes ->
recView.setNote(notes)
}
}
Затем у меня есть кнопка, которая запускает новую активность для создания новой Note
.Эта заметка содержит список Line
s, который на данный момент содержит только строку и внешний ключ.
data class Line {
var id: Long? = null
var note_id: Long? = null
var payload: String? = null
}
Note
и Line
являются отношением один-ко-многим, и они связаны id
Note
и внешний ключ note_id
в Line
.(Я не пишу здесь весь код, он работает, поверьте мне)
Проблема в том, что для вставки Lines
в базу данных мне сначала нужно вставить родительский Note
, и я делаю это,И это работает почти нормально тоже.Но liveData getAllNotes()
из первого Activity получает уведомление от этой вставки.И если в результате пользователь решает удалить все строки и вернуться к первому действию, даже если я удаляю временную сущность Note
из базы данных, список в первом действии показывает ее на мгновение, поскольку она удаляется вфон с небольшой задержкой.
Что я вижу в качестве решения:
1) Отписаться от наблюдателей от liveata.Я попытался сделать это в методе onStop, но он вызывается после метода onCreate
второго действия, в котором создается сущность, поэтому жилатата уже получает уведомление, а наблюдатели удаляются после того, как временный Note
передан в список.
2) Не использовать Room / SQLite в качестве кэша.Поскольку это примечание и строки не гарантированы, то остаются и не должны быть показаны или вставлены в таблицу.Итак, я могу хранить все это в свойствах viewModel (то есть в памяти).Но я вижу много дополнительной работы по сохранению этих сущностей с помощью поворота экрана, минимизации приложения и всего такого с сохранением состояния и его восстановлением.
3) Создайте две дополнительные сущности, такие как CachedNote и CachedLine и соответствующие таблицы,работать с ним, пока я не решу сохранить работу, вставить ее в исходные таблицы и показать ее.
4) Добавьте свойство к сущности Note, например «visible», и добавьте этот параметр в Query, чтобы сделать заметку сущности.показано, пока я не решу упорствовать в работе.Но там может быть много «updateNoteWithLines» в каждом месте.
Что мне делать?Я не гуглил ничего полезного.Я знаю, что это как "Какой вопрос лучше", прости меня.