Firebase 按值获取子名称并将其删除

Posted

技术标签:

【中文标题】Firebase 按值获取子名称并将其删除【英文标题】:Firebase get child name by value and remove it 【发布时间】:2017-07-25 15:35:12 【问题描述】:

我的 JSON 如下所示:

users
  username1: "WWOdh96Yr3Qs4N3GWDVq3OlQFfB2"
  username2: "RJ6PztTLmsg222oUygWHtWpVHdg1"

我想通过他们的密钥(auth.uid)获取“username1”!如果它找到我想删除它,所以删除后它会是这样的:

    users
  username2: "RJ6PztTLmsg222oUygWHtWpVHdg1"

.

self.ref.child("users").queryOrderedByValue().queryEqual(toValue: user?.uid).observe(.value, with:  snapshot in

                            if snapshot.exists() 

                                print("\(snapshot.value)")
                                snapshot.ref.child(snapshot.value as! String).removeValue() // this deleting every thing which is WRONG!



                             else

                                print("Not found--")

                            
                            self.ref.removeAllObservers()
                        )
                    

此代码删除用户中的所有内容。我只想删除特定用户。

【问题讨论】:

【参考方案1】:

首先,我的方法是如果我想在 1 时刻查询 1 个值,就像你正在做的那样,我会做一个 observeSingleEvent (这是最好的方法吗?)。但是为了解决您的问题,您忘记添加“用户”路径。下面的代码使用起来更安全,因为您强制展开(不建议在这种情况下使用):

let dataRef = self.ref.child("users")
dataRef.keepSynced(true)
       if let usersUID = Auth.auth().currentUser?.uid
    dataRef.child("users").queryOrderedByValue().queryEqual(toValue: usersUID).observeSingleEvent(.value, with:  snapshot in
        print(snapshot)
       let values = snapshot.value as? NSDictionary
       for (key, value) in values
       print(value) // does this print the uid?
       print(key) // or this one?

            self.ref.child("users/\(key)").removeValueWithCompletionBlock( (err, ref) in
                if err != nil 
                    print(err)
                 else 
                    print(ref)
                    print("Removed")
                
            )
        
    )
    

尝试在打印(快照)之后添加它

【讨论】:

谢谢!但你能告诉我在这种情况下如何使用“observeSingleEvent”吗?使用完整代码编辑您的答案,我们将不胜感激并接受 @Sam 我更新了它,虽然我没有测试它应该可以工作 我很困惑,如果你能解释一下这里发生了什么,请i.gyazo.com/15dc03d6245cad3114120a680e422734.png 我已经提到了照片中发生的事情。有什么想法吗? @Sam 哎呀。一个非常常见的错误是使用observeSingleEvent 使您的数据库保持同步。我在一分钟内编辑代码 @Sam 你能检查一下打印是否正确(用户存在于数据库中)吗?如果它很好,我会进行最后一次更改以使其正常工作,因为我认为您需要再次循环数据。

以上是关于Firebase 按值获取子名称并将其删除的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 按值对类数组进行排序

MySQL - 如何按值在 IN 语句中使用子查询

如何在firebase(swift)中获取子节点的值,并将其显示在视图控制器的标签中

从Firebase数据库中获取子代数,并将其放在一个数组列表中。

删除子标签并将其值连接到父标签的名称

Firebase:如何获取不匹配图像的差异并从存储中删除图像