2017-03-26 8 views
1

verwandeln In meiner App können Leute Wetten auf welche Mannschaft sie denken, wird gewinnen. Wenn sie eine Wette abschließen, sollten einige Dinge in die Datenbank hochgeladen werden. Zuerst der Benutzername der Person, die den Einsatz tätigt. Welche Wette ist das (ist es eine Wette, zwei Wetten drei) und es sollte zeigen, für welche Mannschaft die Wette ist.einen Firebase-Datenbank-Wert in einen Int

Das Problem Ich habe die Wette in eine Int, so dass ich es jedes Mal erhöhen kann, wenn jemand eine Wette macht, so dass sie eine einzigartige Wette haben.

unten Ich habe ein paar Dinge, die ich erklären werde, weil mein Code im Moment aufgrund von Testzwecken durcheinander ist.

in der ViewDidLoad Methode Ich habe die Mittel, um den Benutzernamen und wie viele Wetten, die jemand gemacht hat, zu sammeln. In der Datenbank ist dies standardmäßig eine Zeichenfolge "0".

Wette jetzt self.betNumber sollte den Wert „0“

dann in der submitData Funktion habe ich sicher die betNumber nehmen und es in ein Int drehen dann zuordnen, diesen Wert auf die global deklarierte Variable Wetten

dann erhöhen I Wetten von 1 nach, dass ich versuchen self.bets in einen String und aber in die Datenbank zu werfen als Kind

und das ist, wo ich einen Fehler

import UIKit 
import Foundation 
import Firebase 


class addBets: UIViewController { 
    let betRef = FIRDatabase.database().reference(fromURL: "not showing these sorry") 
    let userRef = FIRDatabase.database().reference(fromURL: "") 
    let ref = FIRDatabase.database().reference(fromURL: "") 
    let currentUser = FIRAuth.auth()?.currentUser 


    @IBOutlet weak var teamOneLabelAdd: UILabel! 
    @IBOutlet weak var teamTwoLabelAdd: UILabel! 

    @IBOutlet weak var teamOneBet: UITextField! 

    @IBOutlet weak var teamTwoBet: UITextField! 



    var userName: String! 
    var teamOne: String! 
    var teamTwo = String() 

    var betNumber: String! 
    var bets: Int = 0 




    var teamOneBetAnotherOne: String! 
    var teamOneBetAnotherTwo: String! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     teamOneLabelAdd.text = teamOne 
     teamTwoLabelAdd.text = teamTwo 


     //Looks for single or multiple taps. 
     let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "dismissKeyboard") 

     //Uncomment the line below if you want the tap not not interfere and cancel other interactions. 
     tap.cancelsTouchesInView = false 

     view.addGestureRecognizer(tap) 

     //self.teamOneBet.delegate = self 
     //self.teamTwoBet.delegate = self 

     let userID = FIRAuth.auth()?.currentUser?.uid 
     ref.child("User").child(userID!).observeSingleEvent(of: .value, with: { (snapshot) in 
      // Get user value 
      let value = snapshot.value as? NSDictionary 
      let username = value?["username"] as? String ?? "" 
      self.userName = username 
      let betnumber = value?["bets"] as? String ?? "" 
      self.betNumber = betnumber 




      // ... 
     }) { (error) in 
      print(error.localizedDescription) 
     } 


    } 

    func textFieldShouldReturn(userText: UITextField!) -> Bool { 
     teamOneBet.resignFirstResponder() 
     teamTwoBet.resignFirstResponder() 
     return true 
    } 


    func dismissKeyboard() { 
     //Causes the view (or one of its embedded text fields) to resign the first responder status. 
     view.endEditing(true) 
    } 

    @IBAction func submitData(_ sender: Any) { 
     // get the userName to tell who is doing the bet and set it as a key 

     sleep(4) 

     if let usernamee = self.userName { 
      if let anotherBet = self.betNumber as? Int { 
       self.bets = anotherBet 
      } 
      self.bets += 1 

      let usableBets = self.bets as? String ?? "" 

      let useRef = self.ref.child("Bets").child(usernamee).child(self.bets as? String ?? "") 

      var values = ["Username": usernamee,"Bet": "0", "ForTeam": ""] 
      if let betOne = self.teamOneBet.text{ 

       if betOne == "" { 

       } else { 
        values["Bet"] = betOne 
        values["ForTeam"] = teamOneLabelAdd.text 
       } 
      } 
      if let betTwo = self.teamTwoBet.text{ 

       if betTwo == "" { 

       } else { 
        values["Bet"] = betTwo 
        values["ForTeam"] = teamTwoLabelAdd.text 
       } 
      } 


     //self.betRef.child("Bets").setValue(self.userName) 
     if let worked = currentUser?.getTokenWithCompletion() { 

      useRef.setValue(values) 
      /* 
      useRef.updateChildValues(values, withCompletionBlock: { (error, ref) in 
       if (error != nil) { 
        print(error!) 
        return 

       } 

      }) 
      */ 



     } 


     self.navigationController?.popViewController(animated: true) 

     } 







    } 

    func getUserName() { 
     let userID = FIRAuth.auth()?.currentUser?.uid 
     ref.child("User").child(userID!).observeSingleEvent(of: .value, with: { (snapshot) in 
      // Get user value 
      let value = snapshot.value as? NSDictionary 
      let username = value?["username"] as? String ?? "" 
      self.userName = username 

      // ... 
     }) { (error) in 
      print(error.localizedDescription) 
     } 
    } 


    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     //let indexPath = self.tableView.indexPathForSelectedRow! 
     //var DestViewController : addBets = segue.destination as! addBets 
     //DestViewController.teamOne = self.teamOne.text! 
     //DestViewController.teamOne = self.teamTTwo 

     if segue.identifier == "gotobetview" { 
      if let destination = segue.destination as? BetView { 

       //destination.userNames = self.teamOne.text! as? String 

       //destination.teamTwo = (self.teamTwo.text! as? String)! 
      } 
     } 

    } 

} 
erhalten

und hier ist die Feuerbasis Struktur der Daten, die ich aus dem „User“ kommt am extrahieren und die Daten, die ich zum Schreiben bin, ist „Wetten“

enter image description here

Antwort

2

Von einem flüchtigen Blick auf den Code, es in dieser Zeile sieht aus wie der Fehler ist:

let useRef = self.ref.child("Bets").child(usernamee).child(self.bets as? String ?? "") 

ich bin nicht ganz sicher, wo Sie die Wetten ein Nutzer zu veröffentlichen wollen, aber, was das tut, ist es useRef, um ein Kind zu Bets.\(usernamee).1, wenn die Wette liegt setzt ist 1 und Bets.\(usernamee).2, wenn die Wette ist 2 usw.

Wenn Sie jede Wette, einzigartig sein möchten, können Sie einfach useRef Um dies ändern:

let useRef = self.ref.child("Bets").child(usernamee).childByAutoId() 

Hier wird einen neuen Eintrag in Feuerbasis schaffen, die etwa wie folgt aussehen :

Bets: 
    usernameyoyo: 
     -Kfx81GvUxoHpmmMwJ9P: 
      Bet: "300", 
      ForTeam: "Natus Vincere", 
      Username: "usernameyoyo" 

So jetzt die Frage, wie die Wetten zu erhalten, die gemacht werden? Gut, das ist eigentlich ganz einfach jetzt, dass jeder eindeutig identifiziert wird:

func getBetsFor(_ username: String) { 
    ref.child("Bets".child(username).observe(.childAdded, with: { snapshot in 
     // 
     // this is the unique identifier of the bet. eg, -Kfx81GvUxoHpmmMwJ9P 
     let betId = snapshot.key as String 

     guard let dict = snapshot.value as? [String: AnyHashable] else { 
      print("failed to get dictionary from Bets.\(username)") 
      return 
     } 

     let bet = dict["Bet"] as? String 
     let forTeam = dict["ForTeam"] as? String 


     // do something with the above information! 

    }) 
} 
+0

lassen Sie mir meine Feuerbasis Struktur ganz schnell @ForestKunecke Post –

+0

ja, ich denke, das (usernamee) .1 wäre richtig. Ich brauche nur jede Wette, um einzigartig zu sein –

+0

@DevinTripp Ich habe es noch einmal aktualisiert, versuchen Sie es. –