Android 带Kotlin的Firebase上的无限循环
因此,我的应用程序是一个二维码扫描器,将二维码id添加到当前用户UID中。我首先验证用户是否已经进行了扫描;如果没有,则将该id添加到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
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是否已经存在?如果它已经存在,我不需要添加它。很高兴听到这个消息。当然,请检查我的答案。我已经看到了你的帖子,但它不起作用……我尝试了一些不同的方法。有没有办法找到该变量上的字符串?