【问题标题】:Firebase database node compare and updateFirebase 数据库节点比较和更新
【发布时间】:2021-02-26 05:10:14
【问题描述】:

是否可以一次查询和更新同一个节点? Am 编写查询以查找节点,如果节点可用,则在同一查询中尝试删除相同的节点,而在此过程中节点正在删除,但再次使用先前的值创建相同的节点。

val query: Query = firebaseDatabase.reference.child("members").orderByChild("resetKey")
        .equalTo(uniqueKey)
    query.addListenerForSingleValueEvent(object : ValueEventListener {
        override fun onDataChange(snapshot: DataSnapshot) {
            if (snapshot.exists()) {
                Log.d("snapshot", snapshot.value.toString())
                for (childSnap in snapshot.children) {
                 
                 val key= childSnap.child("resetKey").value.toString()
                    if (key.isNotEmpty() && key == uniqueKey) {
                   
                        firebaseDatabase.reference.child("members")
                        .child(childSnap.key!!)
                        .child("resetKey").removeValue()      
                    }
                }
            } 
        }

        override fun onCancelled(error: DatabaseError) {
            Log.d("error", error.message.toString())
        }
    })

【问题讨论】:

  • 为什么说“创建与前一个值相同的节点”?我在您的代码中看不到任何 setValue() 方法调用。
  • 删除密钥时,会在 db 中再次创建密钥。这是面临的问题。
  • 代码中是否有对setValue()的调用?如果是,请将其添加到您的问题中。

标签: android firebase kotlin


【解决方案1】:

在持有节点的同时,我们不能更新/删除节点值,但我们可以更新子节点。

【讨论】:

    【解决方案2】:

    是的,你可以这样做。

    这是一个例子

    FirebaseDatabase.getInstance().getReference("ApplicationConfig/Steppers").addListenerForSingleValueEvent(object :ValueEventListener {
                override fun onDataChange(snapshot: DataSnapshot) {
                    if("query")
                      {
                           it.ref.setValue("your value")
                       }
                }
    
                override fun onCancelled(error: DatabaseError) {
                    
                }
            })
    

    要使用的查询:

    if (it.key == "YourKey"), if (it.value == "Your Value")
    

    记得使用addListenerForSingleValueEvent

    【讨论】:

    • 这里首先检查密钥,如果密钥可用,则参考此密钥的父项,然后尝试删除密钥。但是这里的密钥正在删除,并且密钥再次生成相同的值。 (使用 Koin DI 并获取 firebase 的单个实例)
    • 请添加数据库结构
    • Dbname- -child1- {"resetKey" = "xxxx"} -child2- {"resetKey" = "xxxxxxx"} -child3-- {"resetKey" = "xxxxxxxx"}。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多