检查Childs是否具有特定值

时间:2017-09-02 14:37:02

标签: swift dictionary firebase

当用户决定删除他的帐户时,我想删除用户发布的所有内容。

所以我想浏览数据库并删除包含userId的所有内容。

  let userId = API.User.CURRENT_USER?.uid

    API.Post.REF_POST.observeSingleEvent(of: .value) { (Post) in

        if let dict = Post.value as? [String: Any] {
            print("dict", dict)


        let uid = dict["uid"] as? String

            print(uid)
            print(userId)

            if uid == userId {
                print("gefunden")
            }else {
                print("nichts")
            }

        }
    }

这打印出nil为uid。 我仍然打印出所有的帖子数据。

"posts" : {
"-Kt1h76YbyIqmSRkkLsv" : {
  "bookmarkCount" : 0,
  "caption" : "Helm ",
  "characterCount" : 5,
  "commentCount" : 0,
  "creationDate" : 1.504357677437253E9,
  "likeCount" : 0,
  "photoUrl" : "https://firebasestorage.googleapis.com/v0/b/funcloud-8e84e.appspot.com/o/Posts%2F2B9606C8-E28D-4F69-9956-036192D36948?alt=media&token=2cd8712b-ca18-44a9-aa1d-d42e179a8eb7",
  "ratio" : 1.5056179775280898,
  "score" : -24,
  "uid" : "hUhEPEg99HMkas6CqMXE4ZIyu472"
},
"-Kt1msnhcK4sxGKi5cae" : {
  "bookmarkCount" : 0,
  "caption" : "",
  "characterCount" : 0,
  "commentCount" : 0,
  "creationDate" : 1.50435918759132E9,
  "likeCount" : 0,
  "photoUrl" : "https://firebasestorage.googleapis.com/v0/b/funcloud-8e84e.appspot.com/o/Posts%2F5E96D809-AF10-4FD7-B18A-4D138DDD4878?alt=media&token=16b9452b-25da-4f7b-9d93-80e557c91490",
  "ratio" : 0.75,
  "score" : 0,
  "uid" : "hUhEPEg99HMkas6CqMXE4ZIyu472"
}
},

当currentUserId等于帖子的ID时,这意味着它已被该用户发布,我想删除整个帖子。

谢谢!

3 个答案:

答案 0 :(得分:0)

我认为您的数据库结构是错误的。 Firebase建议使用平面数据表示

尝试在User下添加一个新节点,其中包含他发送的帖子的ID。

user : {
    userId : {
      /* user data */
      posts: {
         postId1: true // the value isn't important
         postIdX: true  
      }
    }
    name : username
}

posts : {
    postId1: {
        /*post data*/
    }
}

现在你需要遍历你知道url的帖子字典:

child("user/\(userId)/posts")

对于恢复的每个密钥,您可以调用removeValue()方法,该方法将删除包含在下面的所有数据:

for (key, _) in dictionary {
    Database.database().child("posts/(key)").removeValue()
}

希望这能帮到你;)

答案 1 :(得分:0)

我的建议是使用云功能删除所有数据。

https://firebase.google.com/docs/functions/

在这里,您可以阅读更多相关信息。 如果云功能管理这个过程,你不必担心如果删除以某种方式失败,网络连接不良等情况会发生这种情况。

答案 2 :(得分:0)

好的,我现在发现了。以下是代码如何遍历数据库并查看子项是否包含值的代码,在我的示例中为userId。

let userId = API.User.CURRENT_USER?.uid

    API.Post.REF_POST.observeSingleEvent(of: .value) { (snapshot) in

        let arraySnapshot = (snapshot.children.allObjects as! [DataSnapshot])
// This is in order to take every single child into Account.
        arraySnapshot.forEach({ (child) in
            if let dict = child.value as? [String: Any] {
                let uid = dict["uid"] as? String
                //now I check every single child whether it contains the userId or now
                                if uid == userId {
                                    print("gefunden")
                                    Database.database().reference().child("posts").child(child.key).removeValue()
// I case the child contains the userId, I delete it. The child.key is the randomly created id of the child in which I am currently checking for the value.
                                } else {
                                    print("nichts")
                                }
            }
        })
    }

之前我的问题是我刚刚打印出整个数据库,现在我在我的数据库中查找每个孩子,如果它包含我的用户即将删除他的帐户的值“uid”。