2017-03-13 8 views
2

Ich versuche, die Daten zu sortieren, die ich nach Datum erhalte, aber es funktioniert nicht. Dies sind die Daten, die ich sortieren möchten:Firebase sortiere Daten nach Datum

{ 
"events": { 
    "Saturday, May 6, 2016" : [ null, { 
    "Id" : 3, 
    "LogoImage" : "image_url", 
    "MainImage" : "image_url", 
    "Name" : "event_name" 
    }, { 
    "Id" : 4, 
    "LogoImage" : "image_url", 
    "MainImage" : "image_url", 
    "Name" : "event_name" 
    } ], 
    "Saturday, April 8, 2016" : [ null, { 
    "Id" : 1, 
    "LogoImage" : "image_url", 
    "MainImage" : "image_url", 
    "Name" : "event_name" 
    }, { 
    "Id" : 2, 
    "LogoImage" : "image_url", 
    "MainImage" : "image_url", 
    "Name" : "event_name" 
    } ] 
} 
} 

ich sie nach Datum geordnet wollen, aber das Problem ist, dass Datum der Schlüssel von einer Liste von Elementen ist. Wie kann ich das tun?

Ich habe dies versucht, aber es funktioniert nicht:

ref.child("events").queryOrderedByKey().observeSingleEvent(of: .value, with: { (snapshot) in 
    let results = snapshot.value as! [String: Any] 
     for (eventDate, arr) in results { 
      let eventsDate = EventsDate() 
      eventsDate.eventsDate = eventDate 
      print(eventDate) 
     } 
}) 

Dank

+0

Sie sollten Firebase die IDs für Sie erstellen lassen. Sie werden anhand des Zeitpunkts erzeugt, zu dem die Daten erstellt wurden, und sortieren automatisch die Daten für Sie. – Starlord

+0

Sie müssen keinen Schlüssel für 'queryOrderedByKey()' angeben? –

+0

Was machst du * innerhalb * des Rückrufs? Höchstwahrscheinlich konvertieren Sie den Snapshot in ein Dictionary, wodurch die Reihenfolge tatsächlich aufgehoben wird (da ein Dictionary inhärent ungeordnet ist). Um sicherzustellen, dass Sie die Objekte in der richtigen/richtigen Reihenfolge erhalten, führen Sie eine Schleife über "snapshot.children" aus. –

Antwort

2

Ihre Daten ist durch den Schlüssel (Datum) sortiert werden, aber das Problem ist, dass Ihr Schlüssel ist ein String und Strings werden alphabetisch sortiert. Also werden Sie alle F Freitags zuerst, dann M Ondays, und so weiter bekommen.

Um chronologisch zu sortieren, müssen Sie ein Format verwenden, das Datumsangaben als aufsteigende Zahlen darstellt, dh einen Zeitstempel. Firebase verfügt über eine praktische Verknüpfung zum automatischen Auffüllen von timestamps in einem Standardformat, wenn sie in die Datenbank geschrieben werden, aber leider nur dann, wenn Sie die Uhrzeit benötigen, zu der die Daten erstellt werden. Es ist jedoch nicht schwierig, einen Zeitstempel für ein beliebiges Datum und eine beliebige Uhrzeit zu erstellen, und es gibt viele Bibliotheken, die das in ein für Menschen lesbares Format, das Sie in Ihrer Benutzeroberfläche mögen, hin und her konvertieren. Wenn Sie nur Interesse an dem Tag sind, können Sie wahrscheinlich mit einem einfachen sortierbar Format wie ISO-8601 weg:

{ 
"events": { 
    "2016-05-06" : [ null, { 
    "Id" : 3, 
    "LogoImage" : "image_url", 
    "MainImage" : "image_url", 
    "Name" : "event_name" 
    }, { 
    "Id" : 4, 
    "LogoImage" : "image_url", 
    "MainImage" : "image_url", 
    "Name" : "event_name" 
    } ], 
    "2016-04-08" : [ null, { 
    "Id" : 1, 
    "LogoImage" : "image_url", 
    "MainImage" : "image_url", 
    "Name" : "event_name" 
    }, { 
    "Id" : 2, 
    "LogoImage" : "image_url", 
    "MainImage" : "image_url", 
    "Name" : "event_name" 
    } ] 
} 
} 

Es ist auch nicht ratsam, was Sie mit arrays in den Daten tun, aber das ist für ein anderes Thema.

+0

Danke, ich werde es versuchen und Sie über das Ergebnis informieren. Kannst du mir jetzt bitte sagen, was mache ich falsch mit Arrays in den Daten? Danke –

+0

Arrays sind in Firebase im Allgemeinen eine schlechte Idee, mit Ausnahme von sehr speziellen Fällen, da sie in eine Integer-Keyed-Map konvertiert werden und es schwierig ist, ihre Indizes konsistent zu halten, wenn die Daten aktualisiert werden. Es ist besser, Push-IDs, Priorität oder nach einem anderen sinnvollen Wert zu verwenden, wie in dem Artikel beschrieben, den ich verlinkt habe. Ich kann keinen konkreten Ratschlag geben, ohne mehr über Ihre App zu erfahren, aber Sie müssen möglicherweise [Ihre Daten dementisieren] (https://firebase.google.com/docs/database/ios/structure-data#flatten_data_structures) in gewisser Weise verwenden das unterstützt die Abfragen, die Sie vornehmen müssen, besser. –

0

Firebase seine eigenen Schlüssel hat (die UID es für Sie generiert) und priorisiert standardmäßig mit dem orderedBy_ Abfrage diejenigen. Diese Standardschlüssel werden nach Datum/Uhrzeit priorisiert.

Was Sie (wahrscheinlich) wollen, ist nach "Kind" zu bestellen, die im Wesentlichen Ihre eigenen Schlüssel sind. Versuchen Sie Folgendes:

ref.queryOrdered(byChild: "Id") 

oder was auch immer andere Kindschlüssel Sie mögen.

+0

das sortiert sie nach ID .. Ich will nach Datum. Dies ist das Datum des Ereignisses (wenn es stattfindet), also nicht wenn das Ereignis zur Datenbank hinzugefügt wurde. –

+0

Ist "Datum" ein "untergeordneter" Schlüssel in Ihrer Datenbank? Wenn ja, gilt die gleiche Logik. Verwenden Sie das Datum anstelle der ID. Suchen Sie den Kindschlüssel in Ihrer Datenbank, der "date" entspricht (sehen Sie sich Ihre Datenbank bei firebase.com an) und wenden Sie diesen Schlüssel mit dem obigen Code an. – Oprimus

Verwandte Themen