2017-02-23 1 views
0

Wie überprüfen Sie, ob ein Wert größer als ein Firebase-Wert ist und nur überschreiben, wenn der neue Wert höher ist?Schreiben Sie den Firebase-DB-Wert nur, wenn der aktuelle Wert größer als der gespeicherte Wert ist

Dies ist mein aktueller Code, wenn Scores eingereicht werden, aber es ersetzt einfach den Scorewert durch den neuen, unabhängig davon, ob er größer ist oder nicht, und addiert sich ebenfalls zur Gesamtpunktzahl. Ich muss nur den Punktestand aktualisieren, wenn es höher ist und nur zum Gesamtpunktestand hinzufügt, wenn es höher ist.

let dbRef2 = FIRDatabase.database().reference() 

    dbRef2.queryOrdered(byChild: "Live Scoring Male/\(String(describing: CompLabel.text!))/score\(String(describing: ProblemLabel.text!))").observe(FIRDataEventType.value, with: { (snapshot) in 

     var previousScore = snapshot.value as? Double 
     print (previousScore) 

    }) 

    if Double(ScoreLabel.text!)! > previousScore { 

    self.dbRef.child("Live Scoring Male/\(String(describing: CompLabel.text!))/score\(String(describing: ProblemLabel.text!))").setValue(Int(ScoreLabel.text!)) 


    self.dbRef.child("Live Scoring Male/\(String(describing: CompLabel.text!))/attempts\(String(describing: ProblemLabel.text!))").setValue(Int(AttemptsLabel.text!)) 

    let dbRef1 = FIRDatabase.database().reference().child("Live Scoring Male/\(String(describing: CompLabel.text!))/scoreTotal") 

    dbRef1.queryOrdered(byChild: "scoreTotal").observe(FIRDataEventType.value, with: { (snapshot) in 

     let currentScore = snapshot.value as? Double 

     let newScore = ["scoreTotal": Double(currentScore!) + Double(self.ScoreLabel.text!)! - Double(self.AttemptsLabel.text!)!*0.1] 

     self.dbRef.child("Live Scoring Male/\(String(describing: self.CompLabel.text!))").updateChildValues(newScore) 

     }) 

     dbRef1.removeAllObservers() 

    } 

Antwort

0

Um dies zu tun Sie Ihre Datenbank für die aktuelle Punktzahl benötigen abzufragen und dann Client-Seite zu überprüfen, ob der neue Wert größer ist als der aktuelle Wert ist. Ich bin mir nicht sicher, welche Art von App Sie haben, aber wenn Ihre App es mehreren Nutzern erlaubt, ihre neuen Bewertungen gleichzeitig zu veröffentlichen, dann sollten Sie dies mit einem Transaktionsblock tun, nur wenn zwei Personen genau zur selben Zeit das tun.

Hier ist ein Beispiel dafür, wie ein Transaktionsblock für Ihre Situation zu verwenden ...

func updateScore(newScore: Int){ 
    let ref = fireRootRef.child("currentScore") 

    ref.runTransactionBlock({ (data)-> FIRTransactionResult in 
     print("ENETERED TRANSACTION BLOCK and data is \(data)") 

     //here `value` is equal to the current value stored in firebase 
     var value = data.value as? Int 
     if value == nil { 
      value = newScore 
     } else if value! < newScore { 
      value = newScore 
     } 


     return FIRTransactionResult.success(withValue: data) 
    }, 
            andCompletionBlock: {(error, bool, snapshot)-> Void in 
             if error != nil{ 
              print("ERROR in transaction block \(error)") 
             } 
             print("bool value in completion block = \(bool)") 
             print("transaction block snapshot = \(snapshot)") 
    }) 
} 

Wenn nur ein Benutzer diesen Wert verändern kann, dann können Sie einfach die Datenbank abfragen wie

func updateScore(newScore: Int) { 
    let ref = fireRootRef.child("currentScore") 

    ref.observeSingleEvent(of: .value, with: {(snapshot)-> Void in 
     if let currentScore = snapshot.value as? Int, newScore > currentScore { 
      ref.setValue(newScore) 
     } 
    }) 
} 
+0

können wir nicht die Datenvalidierung setzen in Firebase lieber im Code tun? – Shohrab

+0

hm nicht sicher. Meinst du über Firebase-Regeln? – MikeG

Verwandte Themen