【问题标题】:Infinite cycle on Firebase with Kotlin使用 Kotlin 在 Firebase 上实现无限循环
【发布时间】:2021-03-05 12:32:07
【问题描述】:

所以,我的应用程序是一个 QR 码扫描仪,它将 QR id 添加到当前用户 UID。我首先验证用户是否已经进行了扫描;如果没有,则将该 id 添加到 firebase 表中;否则,它将创建该表。 这是我的代码:

private fun infoAdd(str2: String, view: View) {
        val  currentUser = auth.currentUser?.uid
        val postReference = FirebaseDatabase.getInstance().getReference("organsUsers")
        val dbView = postReference.child(currentUser.toString())
        val postListener = object : ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {
                val org = snapshot.child("uOrgans")
                if (org != null) {
                    val post = org.getValue(String::class.java)
                    dbView.child("uOrgans").setValue("$post,$str2")
                } else {
                    dbView.child("uOrgans").setValue(str2)
                }
            }

            override fun onCancelled(databaseError: DatabaseError) {
            }
        }
        dbView.addValueEventListener(postListener)
    }

str2是二维码id的字符串。

这就是 Firebase 发生的情况:

请帮忙!!!!

【问题讨论】:

    标签: android firebase kotlin firebase-realtime-database


    【解决方案1】:

    我首先验证用户是否已经进行了扫描;如果没有,则将该 id 添加到 firebase 表中;否则,它将创建该表。

    这没有任何意义,因为在这两种情况下,您都将str2 的值“设置”到数据库中,这就是为什么您会看到以黄色突出显示该操作的行为。因为 Firebase 实时数据库是 NoSQL 数据库,并且结构为键和值对,所以每个节点都是一个 Map,这意味着在使用 setValue() 操作时,旧值会被新值替换。

    如果要检查uOrgans的值是否存在,则更新它,例如,请使用以下代码行:

    val uid = FirebaseAuth.getInstance().currentUser!!.uid
    val rootRef = FirebaseDatabase.getInstance().reference
    val uidRef = rootRef.child("organsUsers").child(uid)
    val valueEventListener = object : ValueEventListener {
        override fun onDataChange(snapshot: DataSnapshot) {
            val org = snapshot.child("uOrgans")
            if(org.exists()) {
                val post = org.getValue(String::class.java)
                dbView.getRef().updateChildren(mapOf("uOrgans" to "$post,$str2")) //Update it
                Log.d("TAG", $post,$str2)
            } else {
                uidRef.child("uOrgans").setValue(str2)
            }
        }
    
        override fun onCancelled(databaseError: DatabaseError) {
            Log.d("TAG", databaseError.getMessage()) //Don't ignore potential errors!
        }
    }
    uidRef.addListenerForSingleValueEvent(valueEventListener)
    

    如果不存在,则将str2 添加到数据库中。

    有一点需要提一下,如果uOrgans 不存在,那么它的所有父节点(organsUsers 和 UID)都将不存在。

    【讨论】:

    • 我试过了,但 updateChildren 只接受 Map,而不是 String...它给了我一个错误。
    • 是的,你是对的。对不起这是我的错。而不是传递一个字符串,而是传递一个地图,就像我更新的答案一样。
    • 谢谢!有效!你能再帮我一件事吗?我如何验证 tha id 是否已经存在?如果它已经存在,我不需要添加它。
    • 很高兴听到这个消息。当然,请从post查看我的回答。
    • 我已经看到了你的帖子,但是它不起作用...我尝试了一些不同的方法。有没有办法在那个变量上找到一个字符串?
    猜你喜欢
    • 2021-03-23
    • 2020-09-29
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多