2016-11-03 7 views
0

Ich versuche, meine Daten nach Datum zu sortieren, aber es scheint, als ob die Daten zufällig herauskommen. Kann mir jemand sagen, warum meine queryOrdered(byChild: "startDate") nicht funktioniert? Und wie bekomme ich die Daten sortiert?Daten von Firebase sind unsortiert

Sie können meine Datenstruktur hier sehen: Complex Query

Code:

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

Periode:

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

Sind Sie verwenden struct, wenn ja, aktualisieren Sie Ihre Frage mit Ihrer Struktur .. – Dravidian

+0

Fertig @Dravidian :) – Grumme

+0

Wenn Sie den Snapshot in ein Wörterbuch konvertieren, wird seine Reihenfolge undefiniert. Siehe http://stackoverflow.com/questions/40166483/firebase-getting-data-in-order/40168370#40168370 –

Antwort

1

Ändern Sie Ihre Datenstruktur.

einen Index Ihrer Protokolle wie halten: -

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 

Wenn Sie struct verwenden, bevor Sie Ihre Daten in Ihrem Tableview nur sortieren Sie die

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

Ihr struct Nachladen: -

struct Period { 

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

....} 

Wo index_Initial ist Ihre Ind ex von Protokollen. Abgerufen und in Ihrer Struktur gespeichert.

Für Index können Sie einen separaten Knoten in Ihrer Datenbank der Verfolgung der totalNoOfLogs halten und erhöhen es jedes Mal, wenn Ihr Benutzer eine Protokoll macht.

oder Sie können versuchen: -

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) 

      } 
     } 
    }) 

Aber dieser Ansatz funktioniert nur, wenn Sie die Daten in der Datenbank in einer sortierten Weise gespeichert haben (keine preffered Option)

+0

Vielen Dank für Ihre Antwort. Aber können Sie mir sagen, wie die GesamtzahlNoOfLogs funktionieren wird, da die Protokolle für alle Benutzer sind. Wie sollte ich die Protokolle für den bestimmten Benutzer zählen, wenn ich ihn in der Datenbank speichern werde? @Dravidian – Grumme

+0

@Dravidan - Ich kann sehen, dass es jetzt sortiert ist, indem es nur nach dem Index ist, den ich ihm zugewiesen habe. Aber wie sortiert man es nach dem Datum? – Grumme

+0

Ändern Sie das Datumsformat, das Sie speichern, in den ** Zeitstempel ** und verwenden Sie diesen anstelle des Indexes – Dravidian