首页 > 解决方案 > Android Room:添加和删除工作无限

问题描述

我在 project 中使用RecyclerViewRoom 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>

标签: androidkotlinmvvmandroid-roomandroid-livedata

解决方案


好吧,您不需要检查它是否在数据库中。只需在 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()
    }
 }

推荐阅读