Значение не удаляется из словаря
У меня есть словарь в Firebase под названием peopleWhoLike
, ключ - это автоматический идентификатор, а значение - идентификатор пользователя, который мне понравился, я пытаюсь перебрать peopleWhoLike
словарь и найти запись с текущими пользователями uid в качестве значения, чтобы я мог удалить его, но значение не удаляется.
func removeLike(postID: String){
ref.child("posts").child(postID).observe(.value, with: { (snapshot) in
if let info = snapshot.value as? [String : AnyObject]{
if var peopleWhoLike = info["peopleWhoLike"] as? [String : String]{
print("peopleWhoLike - \(peopleWhoLike)")
for person in peopleWhoLike{
if person.value == FIRAuth.auth()!.currentUser!.uid{
peopleWhoLike.removeValue(forKey: person.key)
print("personkey - \(person.key)")
}
}
}
}
})
}
Оба оператора печати печатаются правильно, т.е. person.key
быть правильным ключом
Любая помощь будет высоко ценится спасибо!
1 ответ
У вас есть только снимок (копия) данных там
удалить значение из базы данных firebase; попробуй это:
//path should be like this (i guess):
let currentUserUid = FIRAuth.auth()!.currentUser!.uid
ref.child("posts")
.child(postId)
.child("peopleWhoLike")
.child(currentUserUid)
.removeValue()
или то же самое:
let currentUserUid = FIRAuth.auth()!.currentUser!.uid
ref.child("posts/\(postId)/peopleWhoLike/\(currentUserUid)").removeValue()
ОБНОВИТЬ
вам нравится удалять ключ человека - тогда вы можете:
а) переберите peopleWhoLike и найдите, если это пользователь (но, пожалуйста, поставьте это let currentUserUid = FIRAuth.auth()!.currentUser!.uid
вне петли!
//path should be like this (i guess):
let currentUserUid = FIRAuth.auth()!.currentUser!.uid
// loop and when match `person.value == currentUserUid` then:
ref.child("posts")
.child(postId)
.child("peopleWhoLike")
.child(person.key) //<-- change here
.removeValue()
б) вы ищете в запросе. и затем удалите полученный узел.
ref.child("posts")
.child(postId)
.child("peopleWhoLike")
.startAt(currentUserId)
.endAt(currentUserId)
. [...] do something
я не знаю, можете ли вы позвонить напрямую .removeValue()
с этой точки зрения. но с SingleEvent и снимком вы можете сделать snapshot.ref.removeValue()
- двойная проверка перед удалением. но так как это приводит к ссылке, вы должны прямо в состоянии позвонить .removeValue()
ref.child("posts")
.child(postId)
.child("peopleWhoLike")
.startAt(currentUserId)
.endAt(currentUserId)
.removeValue()
примечание: этот поиск занимает больше времени, чем прямой путь
смотрите здесь документ для запроса:
https://firebase.googleblog.com/2013/10/queries-part-1-common-sql-queries.html
https://firebase.google.com/docs/database/ios/read-and-write
НОТА:
я бы посоветовал вам сохранить его с userUid
в качестве ключа, потому что вам нужно только onliner для удаления (см. мой первый codenippet, где вам не нужно получать все данные из peopleWhoLike
) и в качестве значения просто 1 или вы можете сохранить текущую дату (тогда вы знаете, когда она понравилась)