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

时间:2020-01-28 10:11:48

标签: android android-room android-livedata android-viewmodel

我创建了一个基本示例,其中一个活动是通过LiveData观察会议室DB。有关更多信息,请检查以下代码:

    @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 个答案:

答案 0 :(得分:3)

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

的那些函数。

Room生成所有必需的代码以更新LiveData对象 数据库更新时。生成的代码运行查询 必要时在后台线程上异步进行。这种模式是 用于使UI中显示的数据与数据保持同步 存储在数据库中。

More Info