2017-03-26 9 views
1

私のアプリでは、誰が勝つと思うチームで賭けをすることができます。彼らが賭けに行くときには、いくつかのことをデータベースにアップロードする必要があります。最初に賭けをしている人のユーザー名。これは(これは1ベット2ベット3ベット)であり、それはどのチームがベットするのかを示すはずです。firebaseデータベースの値をIntに変換

問題私は、誰かがユニークな賭けを持つように誰かが賭けをするたびに増分することができるように、賭けをIntに変えました。

以下私はテスト目的のためにコードが混乱しているので、私が説明するいくつかのことがあります。

viewDidLoadメソッド私は、ユーザー名と、誰かが何回行ったかを集める手段を持っています。データベースでは、これはデフォルトで文字列 "0"として扱われます。

は今self.betNumberは私が安全に、変数賭け

をグローバルにその値を宣言割り当てるbetNumberを取るとのIntにそれを回すsubmitData機能で、値「0」

を持つべきである賭けますその後、私は子供

としてデータベースに私は文字列にself.betsをキャストしようと、それそれの後に1 で賭けをインクリメントし、これは、私はエラーを取得する

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

    } 

} 
です

、ここでfirebase構造は、それは、私が抽出していたデータは、「ユーザー」から来ていると私が書いていたデータはあなたのコードをザッと見てから、「ベット」

enter image description here

答えて

2

をあるあります

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

私は、ユーザーが行う賭けを掲示する場所を完全にわからないが、何それはありませんが、それはBets.\(usernamee).1たときに賭けにある子供にuseRefを設定されています。エラーは、この行にあるように見えます1であり、Bets.\(usernamee).2ベットが2である、など

あなたは、各賭けが一意になりたい場合は、単にこれにuseRefを変更することができます。

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

これは次のようになりますfirebaseに新しいエントリを作成します。 :

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

だから今の質問は作られて賭けを取得する方法ですか?まあ、これは今、一つ一つが一意に識別されていることを実際には非常に簡単です:

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

ええ、私は(usernamee)0.1は正しいことだと思う私のfirebase構造実際に素早く@ForestKunecke –

+0

を投稿してみましょう。私は賭けが一意であるようにする必要があります –

+0

@DevinTripp私はもう一度それを更新しました。 –

関連する問題