Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 带Kotlin的Firebase上的无限循环_Android_Firebase_Kotlin_Firebase Realtime Database - Fatal编程技术网

Android 带Kotlin的Firebase上的无限循环

Android 带Kotlin的Firebase上的无限循环,android,firebase,kotlin,firebase-realtime-database,Android,Firebase,Kotlin,Firebase Realtime Database,因此,我的应用程序是一个二维码扫描器,将二维码id添加到当前用户UID中。我首先验证用户是否已经进行了扫描;如果没有,则将该id添加到firebase表中;否则,它将创建该表。 这是我的代码: private fun infoAdd(str2: String, view: View) { val currentUser = auth.currentUser?.uid val postReference = FirebaseDatabase.getInstance

因此,我的应用程序是一个二维码扫描器,将二维码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是QR id的字符串

这就是Firebase的情况:

请帮忙

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

这没有任何意义,因为在这两种情况下,您都在将
str2
的值“设置”到数据库中,这就是为什么您会看到以黄色突出显示该操作的行为。因为Firebase实时数据库是NoSQL数据库,并且以键和值对的形式构造,所以每个节点都是一个映射,这意味着在使用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只接受映射,而不接受字符串……这给了我一个错误。是的,你是对的。对不起,我的错。不要传递字符串,而是像我更新的答案中那样传递地图。谢谢!成功了!你能再帮我一件事吗?如何验证该id是否已经存在?如果它已经存在,我不需要添加它。很高兴听到这个消息。当然,请检查我的答案。我已经看到了你的帖子,但它不起作用……我尝试了一些不同的方法。有没有办法找到该变量上的字符串?