Android: наблюдение за комнатным БД через LiveData & ViewModel в Activity - PullRequest
0 голосов
/ 28 января 2020

Я создал базовый c пример, в котором активность просматривает БД комнаты через LiveData. Для получения дополнительной информации, пожалуйста, проверьте следующий код:

    @Dao
    interface NoteDao {
        @Query("SELECT * FROM note ORDER BY date_created DESC")
        fun getAll(): LiveData<List<Note>>
    }

    // Repository
    class ReadersRepository(private val context: Context) {
        private val appDatabase = Room.databaseBuilder(context, AppDatabase::class.java, DATABASE_NAME)
                    .build()
        fun getAllNotes(): LiveData<List<Note>> {
            return appDatabase.getNoteDao().getAll()
        }
    }

    // ViewModel   
    class AllNotesViewModel(application: Application) : AndroidViewModel(application) {
        private val repository = ReadersRepository(application)
        internal var allNotesLiveData: LiveData<List<Note>> = repository.getAllNotes()
    }

    // Activity
    class MainActivity : BaseActivity<AllNotesViewModel>() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            setSupportActionBar(toolbar)

            viewModel.allNotesLiveData.observe(this, Observer {
                adapter.setData(it)
            })
        }
    }

Итак, вот в чем дело. Работает нормально. Любое обновление БД из фона происходит, когда Activity получает обратный вызов

Однако, почему он не выдает никаких ошибок при доступе (наблюдении) к БД на MainThread?

Правильно ли я реализовал? Чего мне не хватает в этом?

1 Ответ

2 голосов
/ 28 января 2020

Это поведение комнаты по умолчанию. По умолчанию он запрашивает в фоновом потоке те функции, тип возврата которых LiveData

. Room генерирует весь необходимый код для обновления объекта LiveData при обновлении базы данных. Сгенерированный код выполняет запрос асинхронно в фоновом потоке, когда это необходимо. Этот шаблон полезен для синхронизации данных, отображаемых в пользовательском интерфейсе, с c с данными, хранящимися в базе данных.

Подробнее

...