2017-12-12 1 views
0

Dies ist, wie meine Firebase wieMit Swift Pull Daten von Feuerbasis

Firebase ScreenShot

enter image description here

Das sieht mein Code

override func viewDidLoad() { 
    var sum = 0 
    var counter = 0 
    super.viewDidLoad() 
    ref = Database.database().reference() 
    ref.child("WaterAdded").observe(.childAdded, with: { (snapshot) in 
     if let totalwateradded = snapshot.value as? [Int]{ 
      while counter < (totalwateradded.count) { 
       var newValue = totalwateradded[counter] 
       sum += newValue 
      } 
     self.totalAdded.text = "\(sum)" 
     } 
    }) 
} 

ich die ganze Zahl greifen wollen in Firebase und zeige die Summe an. Aber es zeigt nichts an.

+0

ich ein paar Dinge bemerken: Erstens, es sieht aus wie der Code die snapshot.value auf ein Array von ganzen Zahlen wirft , die es nur in eine Ganzzahl umwandeln sollte. Außerdem werden die Werte als Zeichenfolgen anstelle von ganzen Zahlen gespeichert. Auch was ist "totalwateredded"? Wenn es keinen Anfangsinhalt hat, wird der Code innerhalb der "while" -Schleife niemals ausgeführt. –

Antwort

0

Sie können nicht direkt gegossen snapshot.value auf [Int], statt, wenn Sie alle Objekte in Ihrem Knoten erhalten möchten Sie

let ref = Database.database().reference() 
    ref.child("WaterAdded").observe(.childAdded, with: { (snapshot) in 
     if let water = snapshot.value as? String{ 
      guard let waterAmount = Int(water) else{return} 
      sum += waterAmount 

     } 
    }) 

dass während benutzen sollten Eine Schleife wird nicht benötigt, da Sie dadurch alle Werte in der Datenbank erhalten.

bearbeiten

In der Datenbank Sie Strings und Ints Nummern speichern können. Sie speichern sie als Strings. Wenn Sie sie in Swift laden, müssen Sie den Wert bedingt in String (als? String) umwandeln. Das Problem besteht jedoch darin, dass Sie keine arithmetischen Operationen für Strings ausführen können, sodass Sie die Anweisung Int (water) verwenden können, um sie in Int umzuwandeln. Diese Operation kann eine Ganzzahl aus einer Zeichenkette ergeben, wenn sie eine Zahl enthält, aber sie kann auch fehlschlagen (zB Int ("zwei")). Deshalb verwenden wir guard let, um sicherzustellen, dass wir nur zur nächsten Zeile fortfahren, wenn sie erfolgreich konvertiert werden kann zu einem Int. Danach fügen wir einfach den int-Wert zur Summe und fertig hinzu.

+0

zeigt immer noch nichts – LOTR94

+0

Sind Sie sicher, dass WaterAdded ein direktes Kind der Wurzelreferenz ist? Drucken Sie die Summe auf die Konsole? –

+0

Ja, und ich habe sogar versucht, einen Ausdruck ("helloworld") zu erstellen, um es zu testen. Es zeigt auch nicht. – LOTR94

0

versuchen ...

if let snap = snapshot.value as? Dictionary [Sting: Any], let totalWaterAdded = 
snap["\(yourDictionaryKey)"] as? Int{ 
//enter your code... 
} 
0

Hier ist die Antwort, die den Knoten liest, die Werte summiert und es zur Konsole druckt.

let ref = self.ref.child("WaterAdded") 
ref.observeSingleEvent(of: .value, with: { snapshot in 
    var x = 0 
    for child in snapshot.children { 
     let val = (child as! DataSnapshot).value as! Int 
     x = x + val 
    } 
    print("sum: \(x)") 
}) 

Wir verwenden observeSingleEvent von .value in diesem Fall gibt es wirklich keinen Grund für Feuerbasis über jedes Kind zu durchlaufen, wenn wir es viel schneller in Code tun können. Außerdem müssen wir nicht über childAdded-Ereignisse benachrichtigt werden.

Eine Guard-Anweisung in den Mix zu werfen ist vielleicht eine gute Idee, aber solange Sie sicher sind, dass die Werte nur Ints sind, ist es gut so zu gehen, wie es ist.

mit folgenden Struktur Getestet

WaterAdded 
    a: 0 
    b: 1 
    c: 2 
    d: 3 

und der Ausgang ist

6 
+0

Es stürzte, sagte, dass "Thread 1: Schwerwiegender Fehler: Unerwarteterweise Null beim Entpacken ein optionaler Wert gefunden" in der zweiten Zeile Ihres Codes – LOTR94

+0

@ LOTR94 Richtig. Wie ich bereits erwähnt habe, wenn du sicher bist, werden die Werte nur Int sein, dann ist es gut zu gehen. Wenn du etwas anderes hast, brauchst du einen Wächter, um ihn zu fangen. Code ist getestet und funktioniert, und ich verwende keine optionalen Werte in der zweiten Zeile. Denken Sie daran, self.ref durch * Ihre * Firebase-Stammreferenz zu ersetzen. – Jay