Список объектов «один ко многим» показывает временную сущность из другой операции - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть два занятия.Первое действие показывает список заметок.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 являются отношением один-ко-многим, и они связаны idNote и внешний ключ 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» в каждом месте.

Что мне делать?Я не гуглил ничего полезного.Я знаю, что это как "Какой вопрос лучше", прости меня.

1 Ответ

0 голосов
/ 23 декабря 2018

Вы можете попытаться вызвать observe в onResume, а затем вызвать removeObserver в onPause, таким образом Activity не будет обновлено, пожалуйста, посмотрите на пример здесь .

...