android - Android Room:添加和删除工作无限
问题描述
我在 project 中使用RecyclerView
,Room DB
并尝试通过单击按钮创建一个功能以将记录添加到表或删除(如果存在)。但主要问题是函数无限执行(添加、删除和再次)。
这是代码:
分段
override fun saveDeleteCover(image: ImageView, cover: Cover) {
viewModel.checkIfCoverInDatabase(cover).observe(viewLifecycleOwner, { savedCover ->
//If savedCover is null then save item to table. Otherwise remove
if(savedCover == null) {
viewModel.saveCover(cover)
Toast.makeText(context, "Added to favorite", Toast.LENGTH_SHORT).show()
} else {
viewModel.deleteCover(cover)
Toast.makeText(context, "Removed from favorite", Toast.LENGTH_SHORT).show()
}
})
}
视图模型
fun saveCover(cover: Cover) = viewModelScope.launch {
coverRepository.upsert(cover)
}
fun deleteCover(cover: Cover) = viewModelScope.launch {
coverRepository.deleteCover(cover)
}
fun checkIfCoverInDatabase(cover : Cover) = coverRepository.checkCoverInDb(cover.textId)
存储库
suspend fun upsert(cover : Cover) = db.coversDao().upsert(cover)
suspend fun deleteCover(cover: Cover) = db.coversDao().deleteCover(cover)
fun checkCoverInDb(textId: String) : LiveData<Cover> {
return db.coversDao().checkCover(textId = textId)
}
和 DAO
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun upsert(cover : Cover) : Long
@Delete
suspend fun deleteCover(cover: Cover)
@Query("SELECT * FROM covers WHERE textId=:textId")
fun checkCover(textId: String) : LiveData<Cover>
解决方案
好吧,您不需要检查它是否在数据库中。只需在 deleteCover 方法中传递 CoverId 并运行查询。但是,如果您有需要检查的情况,那么下面就是方法。您不需要实时数据通话
你的 DAO 会像
@Query("SELECT * FROM covers WHERE textId=:textId")
fun checkCover(textId: String) : Cover?
@Query("DELETE FROM covers WHERE textId=:Id")
suspend fun deleteCover(Id: String)
回购将是
suspend fun deleteCover(id: String) = db.coversDao().deleteCover(id)
fun checkCoverInDb(textId: String) : Cover? {
return db.coversDao().checkCover(textId = textId)
}
你的方法就像
override fun saveDeleteCover(image: ImageView, cover: Cover) {
val cover = viewModel.checkCoverInDb(cover.textId)
if(cover == null) {
viewModel.saveCover(cover)
Toast.makeText(context, "Added to favorite", Toast.LENGTH_SHORT).show()
} else {
viewModel.deleteCover(cover.textId)
Toast.makeText(context, "Removed from favorite", Toast.LENGTH_SHORT).show()
}
}
推荐阅读
- video-streaming - 随着时间的推移进行互联网速度测试以测试稳定性?(例如 > 10 分钟)
- c# - Unity CanvasRenderer 需要具有 16 位索引的网格来绘制图表
- node.js - Facebook 更新图像 API
- gnuplot - 将acspline与数据填充曲线相结合
- r - 2 for 循环下的向量
- javascript - 在 python3 中使用 webbrowser 播放 YouTube 视频
- java - Maven Central 上的 J2EE jar 发生了什么变化?
- mysql - 将表列更改为生成日期 - 语法问题
- python - 数据框仅显示来自列分区的选定结果
- javascript - 这对于 JavaScript 绑定方法的 Polyfill 来说是一个可接受的解决方案吗?