当用户决定删除他的帐户时,我想删除用户发布的所有内容。
所以我想浏览数据库并删除包含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时,这意味着它已被该用户发布,我想删除整个帖子。
谢谢!
答案 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”。