【问题标题】:When I delete a data in firebase, it is deleted from the database, but it is not deleted from the list without going to another activity当我在 firebase 中删除数据时,它会从数据库中删除,但不会从列表中删除而无需转到另一个活动
【发布时间】:2021-08-17 20:54:30
【问题描述】:

我列出了 Firebase 用户最喜欢的词。当用户按下 favButton 时,它会删除最喜欢的单词。最喜欢的词在数据库中被删除。但收藏列表不会立即更新,删除的单词仍在列表中。当我从另一个活动回来时,它被删除了。我该如何解决这个问题?我把喜欢的词删掉的地方在适配器里面。

class DeleteFavorite: AppCompatActivity() {
private lateinit var database: DatabaseReference

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    database = Firebase.database.reference

}

 fun deleteFav(keyKelime: String?) {

    val database = FirebaseDatabase.getInstance()
    val userId = FirebaseAuth.getInstance().currentUser?.uid
    val refFavori = database.getReference("/users/${userId}/favorites/${keyKelime}")

    refFavori.removeValue().addOnSuccessListener {
        Log.e("unfav","Fav geri alındı")
    }

 }

我的适配器

 holder.favButton.setOnClickListener {

        if (!isClicked) {
            holder.favButton.setBackgroundResource(R.drawable.ic_favorite_border)

            val deleteFavorite = DeleteFavorite()
            deleteFavorite.deleteFav(kelime.keyKelime)
        } else {
            isClicked = true

            val detayActivity = DetayActivity()
            detayActivity.writeNewFav(kelime?.keyKelime.toString())
            holder.favButton.setBackgroundResource(R.drawable.ic_favorite_dark)
        }
    }

还有我最喜欢的词

    fun tumFavoriler(kelimelerListe: ArrayList<Kelimeler>, rvFav:RecyclerView){

    adapter = KelimelerAdapter(layoutInflater.context,newKelimelerList)//bura kelime istiyoo


    rvFav.adapter = adapter
    
    refFavoriler.get().addOnSuccessListener {

        for( c in it.children){
            val favKelimeId = c.child("kelime_id").value
            kelimelerListe.forEach {
                if (it.kelime_id == favKelimeId){

                    newKelimelerList.add(it)
                    Log.e("it","$newKelimelerList")

                }
            }
        }
        adapter.notifyDataSetChanged()

    }.addOnFailureListener{

    }

【问题讨论】:

    标签: android firebase kotlin firebase-realtime-database


    【解决方案1】:

    这是因为您使用get() 从数据库中读取数据,而数据库(正如documentation 所说)只读取一次值。

    如果您希望您的应用响应数据库中的更改,请使用reading data with a realtime listener 上的文档部分中所示的实时侦听器。

    【讨论】:

    • 我编辑了上面的代码。我删除了 get 并将其更改为 addvaluelistener。但是有问题。仍然不是我想要的。
    • 请不要那样改变你的问题。在您的原始代码中,您使用了get(),这解释了为什么您没有收到任何更新。通过更改您问题中的内容,问答现在不再有意义,并且对未来的访问者没有用处。
    • “出了点问题”很难解决。我建议在调试器中运行代码,在onDataChange 中设置断点并检查更改后是否到达该断点。如果是这样,请单步执行代码以查看它是否符合您的预期。 newKelimelerList 是否具有您在调用 adapter.notifyDataSetChanged() 时所期望的内容?
    • 很抱歉我没有想到这一点。我现在正在修复
    【解决方案2】:

    您可以像 Frank 提到的那样监听数据库中的变化,但您可能对实时更新不感兴趣,因为管理变化的数据可能很困难。

    作为替代方案,您可以假设数据在完成时成功并在本地更新它,例如通过索引删除项目或在本地更新它的键属性。 这是一种称为“积极假设”的做法。

    此过程确实使用与快照侦听器相同的逻辑,但在用户执行特定任务之前它不会触发更改。

    【讨论】:

      猜你喜欢
      • 2019-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多