2017-01-28 10 views
0

Ich habe ein Wörterbuch in Firebase genannt peopleWhoLike, der Schlüssel ist eine Auto-ID und der Wert ist die UID des Benutzers, der mochte, ich versuche, durch die peopleWhoLike Wörterbuch durchlaufen und finden Sie die Eintrag mit der aktuellen Benutzer-UID als Wert, so dass ich es entfernen kann, aber der Wert wird nicht entfernt.Wert nicht aus dem Wörterbuch entfernt

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)") 
        } 
       } 
      } 
     } 
    }) 
} 

Beide drucken print-Anweisungen korrekt, dh person.key die

Screenshot

Jede Hilfe dank sehr geschätzt würde richtigen Schlüssel

zu sein!

+0

Können Sie 'print (peopleWhoLike)' vor dem Entfernen und nach dem Entfernen kopieren und als Text kopieren? – muescha

+0

sollten Sie nur lesen ontime at beginngn 'let currentUserUid = FIRAuth.auth() !. currentUser! .uid', um einige Aufrufe zu beschleunigen – muescha

+0

wo die Likes entfernt werden sollten? – muescha

Antwort

0

haben Sie nur eine Momentaufnahme (eine Kopie) der Daten dort

den Wert aus der Datenbank Firebase zu entfernen; versuchen Sie dies:

//path should be like this (i guess): 
let currentUserUid = FIRAuth.auth()!.c‌​urrentUser!.uid 
ref.child("posts") 
    .child(postId) 
    .child("peopleWhoLike") 
    .chi‌​ld(currentUserUid) 
    .rem‌​oveValue() 

oder gleich:

let currentUserUid = FIRAuth.auth()!.c‌​urrentUser!.uid 
ref.child("posts/\(postId)/peopleWhoLike/\(currentUserUid)").rem‌​oveValue() 

UPDATE

Sie Sie die Person Schlüssel entfernen - dann können Sie:

a) iterieren peopleWhoLike und finden Sie, ob es der Benutzer ist (aber bitte setzen Sie diese let currentUserUid = FIRAuth.auth()!.c‌​urrentUser!.uid außerhalb der Schleife!

//path should be like this (i guess): 
let currentUserUid = FIRAuth.auth()!.c‌​urrentUser!.uid 

// loop and when match `person.value == currentUserUid` then: 
ref.child("posts") 
    .child(postId) 
    .child("peopleWhoLike") 
    .chi‌​ld(person.key) //<-- change here 
    .rem‌​oveValue() 

b) Sie suchen in der Abfrage. und entferne dann den resultierenden Knoten.

ref.child("posts") 
    .child(postId) 
    .child("peopleWhoLike") 
    .startAt(currentUserId) 
    .endAt(currentUserId) 
    . [...] do something 

ich weiß nicht, ob Sie .removeValue() an dieser Stelle nennen lenken kann. aber mit einem SingleEvent und einem Snapshot können Sie snapshot.ref.removeValue() - doublecheck tun, bevor Sie löschen. aber da es sich in einem Referenzergebnisse sollten Sie in der Lage direkt .removeValue()

ref.child("posts") 
    .child(postId) 
    .child("peopleWhoLike") 
    .startAt(currentUserId) 
    .endAt(currentUserId) 
    .removeValue() 

Notiz aufzurufen: Diese Suche dauert länger als einen direkten Weg

siehe hier doc für query:

https://firebase.googleblog.com/2013/10/queries-part-1-common-sql-queries.html#byemail

https://firebase.google.com/docs/database/ios/read-and-write#delete_data

HINWEIS:

Ich würde empfehlen, sie mit dem userUid als Schlüssel zu speichern, weil Sie nur einen Onliner benötigen, um zu löschen (siehe mein erstes codesnippet, wo Sie nicht alle Daten von peopleWhoLike erhalten müssen) und als Wert nur 1 oder Sie können das speichern aktuelles Datum (dann wissen Sie wann es gemocht wurde)

+0

Ich habe versucht, etwas ähnliches zu tun, das Problem ist FIRAuth.auth() !. currentUser! .uid ist der Wert, und Auto-ID ist der Schlüssel, also FIRAuth.auth()!. CurrentUser! .uid ist nicht das Kind von peopleWhoLike –

+0

ich verstehe nicht: in den Kommentaren sagst du - ja es wird von 'peopleWhoLiked' als Schlüssel entfernt - und jetzt sagst du es anders? Sie sollten eine Liste drucken (oder einen Screenshot der Daten unter 'peopleWhoLiked') - ich bitte Sie, einen Ausdruck von' peopleWhoLike' zu ​​Ihrer Frage hinzuzufügen! – muescha

+0

ok der Schlüssel ist 'person.key' und der Wert ist' currentUserUid' – muescha

Verwandte Themen