Android:通过Activity中的LiveData和ViewModel观察Room DB

Uma*_*ari 2 android android-room android-livedata android-viewmodel

我创建了一个基本示例,其中的活动是通过 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)
            })
        }
    }
Run Code Online (Sandbox Code Playgroud)

所以,事情就是这样。它运行良好。后台对数据库的任何更新都会发生,然后 Activity 会收到回调。

但是,为什么在主线程上访问(观察)数据库时没有抛出任何错误?

我是否以正确的方式实施?我在这方面缺少什么?

Muh*_*han 6

这是 Room 的默认行为。默认情况下,它将在后台线程上查询返回类型为的函数LiveData

当数据库更新时,Room 会生成所有必要的代码来更新 LiveData 对象。生成的代码在需要时在后台线程上异步运行查询。此模式对于保持 UI 中显示的数据与数据库中存储的数据保持同步非常有用。

更多信息