【问题标题】:Kotlin firebase realtime database removeValue()Kotlin firebase 实时数据库 removeValue()
【发布时间】:2021-08-14 22:04:37
【问题描述】:

在我的项目中,单词是从数据库中提取并列出的。用户在谷歌注册。我把他们最喜欢的词保存在数据库中。但我希望用户删除收藏夹。我无法给出正确的参考。我获取他在下面单击的单词的 id 并检查它是否在最喜欢的单词中。如果是喜欢的话,应该删掉。

private fun deleteFav(kelime_id: String) {
    val userId = FirebaseAuth.getInstance().currentUser?.uid
    val refUser = database.child("/users/${userId}/")
    val key = refUser.push().key


    val refFavori = refUser.child("/favorites/")

    refFavori.addValueEventListener(object : ValueEventListener {
        override fun onDataChange(dataSnapshot: DataSnapshot) {
                for (childSnapshot in dataSnapshot.children) {

                    val favKelimeId = childSnapshot.child("kelime_id").value

                    Log.i("MEsagge", "inside for")

                    if (kelime_id == favKelimeId) {
                        Log.i("Mesagge", "inside if")
                        Log.i("Mesagge", "${childSnapshot.value}")

                    refFavori.child("$favKelimeId").removeValue()

                    }
                    //Log.i("Database", "child key = $childSnapshot.key")
                    //Log.i("Database", "fav key = $favKelimeId.key")
                }
        }

        override fun onCancelled(databaseError: DatabaseError) {
            // Getting Post failed, log a message
            Log.w(TAG, "loadPost:onCancelled", databaseError.toException())
            // ...
        }

    })
}

##

【问题讨论】:

  • 您共享的代码有什么问题?乍一看还不错。因此,如果您在调试器中逐行执行它,哪一行是第一行没有按照您的预期执行的操作?

标签: firebase kotlin firebase-realtime-database


【解决方案1】:

如果您知道要删除的节点的 kelime_id 值,则可以使用查询来查找与 kelime_id 值匹配的节点:

val refFavori = refUser.child("/favorites/")
var query = refFavori.orderByChild("kelime_id").equalTo(favKelimeId)

refFavori.addValueEventListener(object : ValueEventListener {
    override fun onDataChange(dataSnapshot: DataSnapshot) {
        for (childSnapshot in dataSnapshot.children) {
            childSnapshot.getRef().removeValue()
        }
    }
    ...

您会注意到这要简单得多,另外,它不会从数据库中读取所有 favorites,因此对您和您的用户来说也更便宜。


如果您的 kelime_id 值在 favorites 节点内是唯一的,请考虑将它们用作键,而不是使用 push() 生成唯一 ID。通过使用kelime_id 作为键,您可以删除必要的节点:

refUser.child("favorites").child(favKelimeId).removeValue()

【讨论】:

    猜你喜欢
    • 2020-12-29
    • 2020-09-19
    • 2021-12-04
    • 2021-12-30
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多