2017-10-28 2 views
0

My Firebase Datenstruktur wie folgt aussieht:Firebase JSON Baum Daten-Wiederherstellung in Swift

enter image description here

Der folgende Code den Wert des Labels zu aktualisieren arbeitet der aktuelle Wert von condition zu sein:

import UIKit 
import Firebase 

class ViewController: UIViewController { 

    let conditionRef = Database.database().reference().child("condition") 

    @IBOutlet weak var conditionLabel: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 

     conditionRef.observe(.value) { 
      (snap: DataSnapshot) in 

      self.conditionLabel.text = (snap.value as! String).description 

     } 
    } 

Ich möchte den Wert des Labels auf test2 aktualisieren. Ich habe eine Menge Dinge ausprobiert, aber das, was am meisten Sinn für mich gemacht wurde die Änderung die Konstante conditionRef zu:

let conditionRef = Database.database().reference().child("test1").child("test2") 

Dies funktioniert nicht, und ich bin mir nicht sicher, was wird. Ich habe die Firebase-Dokumentation und mehrere YouTube-Tutorials durchgelesen, kann aber dieses triviale Detail nicht erkennen.

Jede Hilfe wird sehr geschätzt, danke im Voraus.

+0

Beachten Sie, dass * wir x = (snapshot.value wie! String) .beschreibung * kann ein Problem, da die Werte erscheint sein Int Typen. Es sollte wahrscheinlich geändert werden, nur * let x = (snapshot.value als! Int) * solange sie int sind – Jay

Antwort

0

Eine Lösung ist eine Referenz auf den Knoten, den Sie den Wert erstellen möchten und es dann mit einer einzigen Veranstaltung wie diese beachten:

class ViewController: UIViewController { 

    var ref: DatabaseReference! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.ref = Database.database().reference() 

     let test2Ref = self.ref.child("fir-2-b1233").child("test1").child("test2") 

     test2Ref.observeSingleEvent(of: .value, with: { snapshot in 
      let val = snapshot.value as! Int 
      print(val) 
     }) 
    } 
} 

Der Schlüssel ist, dass Sie den gesamten Pfad zu dem Kind gehören, um sicherzustellen, Knoten, von dem die Daten stammen sollen.

und meine Firebase Stucture

{ 
    "fir-2-b1233" : { 
    "condition" : "foggy", 
    "test1" : { 
     "test2" : 0, 
     "test3" : 0 
    } 
    } 
} 
+0

Vielen Dank für Ihre Antwort! Ich habe meine conditionRef auf genau das, was Sie mir gesagt, sowie lassen conditionRef = Database.database() .referenz(). Child ("fir-2-b1233"). Child ("test1"). Child ("test2") aber meine App stürzt immer noch mit einem Thread 1: SIGABRT Fehler, was es nicht tut, wenn ich meine ursprüngliche conditionRef in der Frage oben halte. Hast du noch andere Ideen? –

+0

@ArjunGupta Der Code in meiner Antwort wurde aus einem funktionalen Projekt kopiert und eingefügt, so dass es funktioniert. Wenn Sie diesen Code eliminieren, liegt das Problem anderswo. Möglicherweise ein Unterschied in der Definition meiner Firebase-Referenz und was Sie haben oder möglicherweise der Name des Root-Knotens. Sie fügen einen Screenshot in Ihre Frage ein (es ist besser, Text einzubinden), so dass Ihr Haupt-Eltern-Knoten wie folgt angezeigt wird: * fir-2-b1233 *? Ich habe meine Antwort aktualisiert, um ein vollständiges, funktionierendes Projekt zu enthalten, damit Sie vergleichen können. Beachten Sie in meiner Struktur, dass fir-2-b1233 ein direktes Kind des Hauptelternknoten ist. – Jay

+0

Vielen Dank für Ihre Antwort! Es war der String vs Int, der den Ärger verursachte. –