2016-11-03 9 views
0

データを日付順にソートしようとしていますが、データがランダムに出てくるようです。誰も私のqueryOrdered(byChild: "startDate")が動作しない理由を教えてもらえますか?そして、どのようにデータをソートするのですか?Firebaseのデータはソートされていません

あなたがここに私のデータ構造を見ることができます: Complex Query

コード:

DataService.ds.REF_USER_CURRENT.child("logs").observeSingleEvent(of: .value, with: {(userSnap) in 

     if let SnapDict = userSnap.value as? [String:AnyObject]{ 
      //Run through all the logs 
      for each in SnapDict{ 
       FIRDatabase.database().reference().child("logs/\(each.key)").queryOrdered(byChild: "startDate").observeSingleEvent(of: .value , with : {(Snap) in 

        let period = Period(logId: each.key, postData: Snap.value as! Dictionary<String, AnyObject>) 
        self.periods.append(period) 

        print(period.duration) 
        print(period.startDate) 
        self.tableView.reloadData() 
       }) 
      } 
     } 
    }) 

期間:

struct Period { 

    var _periodId: String! 
    var _startDate: String! 
    var _duration: Int! 
    var logs = [Log]() 

    var _periodRef: FIRDatabaseReference! 

    init() { 

    } 

    init(logId: String, postData: Dictionary<String, AnyObject>) { 
     self._periodId = logId 

     if let startDate = postData["startDate"] { 
      self._startDate = startDate as? String 
     } 

     if let duration = postData["duration"] { 
      self._duration = duration as? Int 
     } 

     _periodRef = DataService.ds.REF_PERIODS.child(_periodId) 
    } 
} 
+0

ています構造体を使用している場合は構造体を使用して質問を更新してください。 – Dravidian

+0

完了@Dravidian :) – Grumme

+0

スナップショットを辞書に変換するとその順序は不定になります。 http://stackoverflow.com/questions/40166483/firebase-getting-data-in-order/40168370#40168370 –

答えて

1

変更し、あなたのデータ構造。

のようなあなたのログのインデックスを保持: -

logs 
-KVMbJKN1i2vAxzutiYq 
    duration: 14 
    index : 1 
    startDate: 28/10/2016 

-KVMbLL4i_9dwaRZ9REB 
    duration: 28 
    index : 2 
    startDate: 01/09/2016 

-KVMiLwoSY34TZpf8mST 
    duration: 14 
    index : 3 
    startDate: 2/2/2016 
totalNoOfLogs : 3 

あなたのtableViewにデータをリロードする前に構造体を使用している場合は、単に

self.periods.sort(by: {$0.index_Initial > $1.index_Initial}) 

あなたの構造体並べ替え: -

struct Period { 

var _periodId: String! 
var _startDate: String! 
var _duration: Int! 
var index_Initial : Int! 

....} 

index_Initialはあなたですログの前。構造体に取り込まれて格納されます。

インデックスのためには、totalNoOfLogsのデータベースの維持トラックに別のノードを維持し、それをユーザーがログを作るたびにインクリメントすることができます。

またはあなたが試すことができます: -

FIRDatabase.database().reference().child("periods").observeSingleEvent(of: .value, with: {(userSnap) in 

     for each in userSnap.children{ 

      if let eachSnapDict = (each as! FIRDataSnapshot).value as? [String:AnyObject]{ 


       print(eachSnapDict) 

      } 
     } 
    }) 
しかし、あなたがソートされた方法(ない兼ね備えオプション)でデータベースに格納されたデータを持っている場合は、このアプローチはのみ動作します

+0

ご回答ありがとうございます。しかし、ログはすべてのユーザーのためであるため、totalNoOfLogsがどのように機能するか教えてください。特定のユーザーのログをデータベースに保存する場合は、どのようにログのカウントを保持する必要がありますか? @Dravidian – Grumme

+0

@Dravidan - それは私がそれに割り当てられたインデックスだけで、それは今ソートされていることがわかります。しかし、どのように日付でそれを並べ替えるには? – Grumme

+0

保存する日付の形式を** timestamp **に変更し、その代わりにインデックスを使用します – Dravidian

関連する問題