2016-12-21 6 views
0

免責事項:私はコーディングとFirebaseにはとても新しいです。Swift Firebase注文クエリ

マイJSONツリーは次のようになります。

 “MAIN LEAGUE“ : { 
       “Team Alpha“ : { 
        "Team Score" : “50”, 
        "Total Time " : "02:22:05", 
        "Team Name" : “Team Alpha“, 

         }, 
       “Team Bravo“ : { 
        "Team Score" : “200”, 
        "Total Time" : "02:09:58", 
        "Team Name" : “Team Bravo“ 
        }, 
       “Team Charlie“ : { 
        “Team Score“ : “150”, 
        "Total Time" : "02:16:50", 
        "Team Name" : “Team Charlie“ 
         } 
     } 

私はデータベースを照会し、チームは最高の「チームスコア」によってランク付けされていることにより、新しいテーブルビューを提示しようとしています。

だから、この順序で表示しようとしている:

" Team Bravo" : "200" 
" Team Charlie" : "150" 
" Team Alpha" : "50" 

私は少し迷ってしまいました。私は試してみましたが、無駄にしました(テーブルビューでは何も返しません)。

struct content { 
     var sTitle : String! 
     var sValue : Any! 

     init(sTitle: String, sValue: Any) { 
      self.sTitle = sTitle 
      self.sValue = sValue 
     } 
    } 

    var dbHandleQuery: FIRDatabaseHandle? 

    var dbrefString = (myDatabasePath)// this is the database path to the correct child 
    ("MAIN LEAGUE") 

      dbHandleQuery=FIRDatabase.database().reference().child(dbrefString).queryOrdered(byChild: "Team Score").observe(.value, with: {(snapshot) in 

    var newContent : [content] = [] 
      for snap in snapshot.children.allObjects as! [FIRDataSnapshot] { 

       let title = snap.key as String 
       let message = snap.value as? String 
       print(snap.key) 
       print(snap.value as Any) 
       newContent.append(content(sTitle: title, sValue: message as Any)) 
       self.myTableView.reloadData() 
      } 
      self.cellContent = newContent 
      self.myTableView.reloadData() 
     }) 

どのようにしてランキングを達成できますか?または、ローカル配列のすべてをロードしてそこからランク付けしてみることをお勧めしますか?どのような助け、大いに感謝!

UPDATE:上記は正しくランク付けされていますが、テーブルはTEAM NAMEのみを取得し、テーブルビューのセル2番目のラベル(2つのラベル、チーム名、合計スコア1)。

だから今、それは次のようになります。

" Team Bravo" 
" Team Charlie" 
" Team Alpha" 

はどうやって一つ一つの隣にそれぞれ対応する合計スコアを付けることができますか?多くのありがとう

答えて

4

これは最善の答えですが、私はそれをうまく動作させ、私が望む結果を得ることができました。あなたが使用しようとしている場合に、データベース「チームスコア」必ずインデックスを作る

dbHandleQuery = FIRDatabase.database().reference().child(dbrefString).queryOrdered(byChild: "Team Score").observe(.value, with: {(snapshot) in 
     var counter = 0 
     var newContent : [content] = [] 
     for snap in snapshot.children.allObjects as! [FIRDataSnapshot] { 

      counter += 1 
      let title = snap.key as String 
      if let rankedBy = snap.value as? [String : Any] { 

      newContent.append(content(sTitle: "\(counter).\(title)", sValue: rankedBy["Team Score"] as Any)) 
       self.myTableView.reloadData() 
      } 
     } 
     self.cellContent = newContent 
     self.myTableView.reloadData() 
    }) 

これが私に与え

"1.Team Bravo" - "200" 
"2.Team Charlie" - "150" 
"3.Team Alpha" - "50" 
+1

:それは同じ問題に遭遇するかもしれない人を助けるために投稿

このコード。 Firebaseのドキュメントには、コードと非常によく似た例があります:https://firebase.google.com/docs/database/security/indexing-data – DoesData