从Room数据库获取的LiveData是否会自动更新?
Room返回的LiveData自动更新的原因
问题描述
我在Dao接口中定义了一个方法,用于从Room数据库获取所有记录并返回LiveData<List<Task>>类型结果,方法代码如下:
@Query("SELECT *FROM task_table ORDER BY taskId DESC") fun getAll():LiveData<List<Task>>
我的ViewModel类中有如下代码:
val tasks:LiveData<List<Task>> = taskDao.getAll()
同时我在Fragment中设置了Observer:
//创建ViewModel实例等其他代码之后 viewModel.tasks.observe(viewLifecycleOwner, Observer { it?.let { adapter.data = it } })
疑问:当我向Room数据库添加新记录时,无需调用getAll()方法,LiveData<List<Task>>就会自动更新。请问是Android系统在数据库增删改时自动更新该列表吗?
解答
这是Room框架本身的特性,并非Android系统层面的自动更新。
当Dao方法返回LiveData类型时,Room会自动为该查询构建可观察的数据源:
- Room内部会监听该查询关联的数据库表(此处为
task_table)的所有增、删、改操作 - 只要表内数据发生变化,Room就会自动重新执行对应的
@Query语句,获取最新数据并推送给LiveData的观察者 - 你完全不需要手动调用
getAll(),因为Room已经帮你完成了数据变化监听和查询自动触发的逻辑
本质上,Room是借助SQLite的通知机制,结合LiveData的生命周期感知能力,实现了数据变化的自动响应。
内容的提问来源于stack exchange,提问作者Amey079
相关产品推荐
相关产品推荐

