如何从LiveData获取最新更新条目?点击保存仅展示最新项
问题描述
每次使用LiveData向数据库添加新条目时,当前代码会取回指定ID对应的数据,但需求是点击保存按钮后,仅在屏幕上展示最新更新/插入的条目。相关代码如下:
Main Activity
viewModel.retrieveItem(idd).observe(this , Observer{ selectedItem = it if(selectedItem != null){ entry = selectedItem as Entry bind(entry) }else{ blank() } }) private fun bind(entry: Entry){ editText.setText(entry.diaryEntry,TextView.BufferType.SPANNABLE) }
ViewModel
fun retrieveItem(id: Int): LiveData<Entry> { return diaryDao.getItem(id) }
DAO
@Query("SELECT * from diary WHERE id = :id") fun getItem(id: Int): LiveData<Entry>
解决方案
问题根源
当前代码通过固定ID idd 查询数据库条目,只会返回该ID对应的数据,无法自动获取最新插入的条目。要实现需求,需修改查询逻辑,聚焦于最新添加的条目。
方案1:用LiveData自动监听最新条目
这种方式会在数据库有新条目插入时,自动更新UI展示最新内容:
- 修改DAO,新增查询最新条目的方法:
@Query("SELECT * FROM diary ORDER BY id DESC LIMIT 1") fun getLatestItem(): LiveData<Entry>
(假设id是自增主键,按id倒序取第一条就是最新插入的条目)
- 修改ViewModel,添加对应方法:
fun retrieveLatestItem(): LiveData<Entry> { return diaryDao.getLatestItem() }
- 修改MainActivity,替换原有的观察逻辑:
viewModel.retrieveLatestItem().observe(this) { latestEntry -> if (latestEntry != null) { bind(latestEntry) } else { blank() } }
方案2:点击保存按钮时手动触发获取最新条目
如果需要严格在点击保存按钮后才更新UI,可结合协程实现:
- 修改DAO,添加同步查询方法:
@Query("SELECT * FROM diary ORDER BY id DESC LIMIT 1") suspend fun getLatestItemSync(): Entry?
- 修改ViewModel,添加触发方法和LiveData:
private val _latestEntry = MutableLiveData<Entry?>() val latestEntry: LiveData<Entry?> = _latestEntry fun getLatestItem() = viewModelScope.launch { val newestEntry = diaryDao.getLatestItemSync() _latestEntry.value = newestEntry } // 假设你已有添加条目的方法 fun addNewEntry(entry: Entry) = viewModelScope.launch { diaryDao.insert(entry) }
- 修改MainActivity,在保存按钮点击事件中触发更新:
// 初始化观察最新条目 viewModel.latestEntry.observe(this) { entry -> entry?.let { bind(it) } ?: blank() } // 保存按钮点击逻辑 saveButton.setOnClickListener { // 先构造并添加新条目 val newEntry = Entry(diaryEntry = editText.text.toString()) viewModel.addNewEntry(newEntry) // 触发获取最新条目 viewModel.getLatestItem() }
内容的提问来源于stack exchange,提问作者Kiran Kittu
相关产品推荐
相关产品推荐

