2016-04-29 12 views
0

Ich habe mehrere Beiträge und jeder Beitrag hat seine eigenen Kommentare. Ich möchte alle Beiträge nach ihren Zeitstempeln geordnet abfragen. Ich habe versucht:Firebase Abfrage Reihenfolge

let query = Firebase(url: path) 
let query.queryOrderedByChild("commentDate").observeEventType(.ChildAdded) 
{ (queryResponse, cancelBlock) { .... 

"commentDate" sind ganze Zahlen auf dem Server. Bei dieser Abfrage erhalte ich nur das erste Objekt

let query = Firebase(url: path) 
query.queryOrderedByChild("commentDate").queryLimitedToFirst(100).observeEventType(.ChildAdded) { (queryResponse, cancelBlock) { ... 

ich auch nur das erste Objekt erhalten ... Die einzige Lösung, die ich im Moment ist alles abfragen:

query.queryOrderedByChild("commentDate").observeEventType(.Value) { (queryResponse, cancelBlock) in ... 

Aber mit Dazu muss ich das Array sortieren, bevor es dem Benutzer angezeigt wird.

Irgendwelche Ideen wie kann ich tun, um sie auf Server sortiert zu bekommen?

bearbeiten Darstellung von Feuerbasis Daten:

{ 
    "-KGRZmSIDXz5hHkelthQ" : { 
    "something1" : "783151", 
    "something2" : "21", 
    "something3" : "wjeicisje ejej", 
    "comments" : "", 
    }, 
    "-KGRa5skGzA1GAG09Lno" : { 
    "something1" : "783151", 
    "something2" : "21", 
    "something3" : "wjeicisje ejej", 
    "comments" : "", 
    }, 
    "-KGVr-tti1zr1M1QLlHL" : { 
    "something1" : "783151", 
    "something2" : "21", 
    "something3" : "wjeicisje ejej", 
    "comments" : { 
     "-KGX1_rFSBLmQJ7QzCRc" : { 
     "commentBody" : "something", 
     "commentDate" : 1.461933727259896E9, 
     "commentOwnerImageView" : "something", 
     "commentOwnerName" : "something" 
     }, 
     "-KGX1r5Lnhv9YbQre6as" : { 
     "commentBody" : "something", 
     "commentDate" : 1.461933797884702E9, 
     "commentOwnerImageView" : "something", 
     "commentOwnerName" : "something" 
     }, 
     "-KGXVGKA0SYm-vRs6zsv" : { 
      "commentBody" : "something", 
     "commentDate" : 1.461941507496439E9, 
     "commentOwnerImageView" : "something", 
     "commentOwnerName" : "something" 
     }, 
    }, 
    } 
} 
+0

Was passiert, wenn Sie Wert Ereignistyp verwenden anstelle von Kind hinzugefügt? –

+0

Wenn ich "Value" setze, bekomme ich alle Objekte. Aber wenn ich "Kind hinzugefügt" setze, bekomme ich nur ein Objekt. Um auf Server abzufragen (orderbyChild) muss ich observeEventType (.ChildAdded) setzen. Hier sind weitere Infos: https://www.firebase.com/docs/ios/guide/retrieving-data.html#section-queries – Andrew

+0

Soweit ich weiß, können Sie eine Abfrage mit jedem Event-Typ und nicht nur Kind hinzugefügt . Und wie im [guide] (https://www.firebase.com/docs/ios/guide/retrieving-data.html#section-event-types) angegeben, soll child added nur 1 Objekt zurückgeben. Haben Sie schon andere Bestellfragen ausprobiert? [QueryOrderedByChild :, queryOrderedByKey :, queryOrderedByValue oder queryOrderedByPriority] (https://www.firebase.com/docs/ios/guide/retrieving-data.html#section-queries) –

Antwort

1

Ihre Datenstruktur sieht gut aus, so dass eine einfache Abfrage werden die Ergebnisse angezeigt Sie

wollen zurückkehren
let commentsRef = ref.childByAppendingPath("-KGVr-tti1zr1M1QLlHL/comments") 

commentsRef.queryOrderedByChild("commentDate").observeEventType(.ChildAdded, withBlock: { 
    snapshot in 

    let nodeData = snapshot.value 
    print(nodeData!) 

}) 

Die oben jedes Kind-Knoten , einer nach dem anderen in der richtigen Reihenfolge.

Wenn Sie eine kleine Menge von Knoten haben, können Sie sie nur einmal eingelesen und die snapshot.children wie diese iterieren

usersRef.queryOrderedByChild("commentDate").observeEventType(.Value, withBlock: { 
    snapshot in 

    for child in snapshot.children { 
    print(child) 
    } 

}) 

über beide der wird jeden Kommentar Knoten durch geordnete auszudrucken commentDate

Das obige funktioniert nur, wenn Sie die Kommentare in jedem Beitrag abrufen möchten. Wenn nicht, werden Sie benötigen, um Ihre Struktur Firebase zu ändern und die Kommentare zu separaten Knoten zu bewegen, wie diese

posts 
    post_01 
    post_02 
    etc 

und einem separaten Kommentare Knoten, der sich auf die Post bezieht sich ist der Kommentar gehört. Da Sie die Kommentare für post_02 abfragen möchten und möchten, dass sie nach commentDate geordnet sind, kombinieren Sie die Postnummer und das Datum in einem einzigen untergeordneten Element.

comments 
    "-KGX1_rFSBLmQJ7QzCRc" : { 
    "for_post_and_commentDate": "post_02_1.461933727259896E9", 
    "commentBody" : "something", 
    "commentOwnerImageView" : "something", 
    "commentOwnerName" : "something" 
    }, 
    "-KGX1r5Lnhv9YbQre6as" : { 
    "for_post_and_commentDate": "post_02_1.461933797884702E9", 
    "commentBody" : "something", 
    "commentOwnerImageView" : "something", 
    "commentOwnerName" : "something" 
    }, 

und ändern Sie dann die Abfrage

usersRef.queryOrderedByChild("for_post_and_commentDate") 
    queryStartingAtValue("post_02_0").queryEndingAtValue("post_02_xxx").observeEventType(.Value, withBlock: { 

Sie werden Ihr commentDate Format haben, um herauszufinden, wie es einfacher wäre, beginnen und enden Zeitstempel zu fertigen, wenn sie gespeichert wurden: 20160430100621 als yyyymmddhhmmss Format

starting: post_02_0 
ending: post_02_99999999999999 

Dies gibt Ihnen auch die Flexibilität für Kommentare zu post_02 abzufragen, die gestern passiert ist, oder:, dann Zeitstempel wie dies könnte abgefragt letzte Woche.

+0

Ihr Code zeigt die Kommentare für einen einzelnen Post in der richtigen Reihenfolge an. Aber OP fragte nach "Ich möchte alle Beiträge nach ihren Zeitstempeln geordnet abfragen". Da ein Beitrag keinen Zeitstempel hat, ist dies nicht möglich. –

+0

@FrankvanPuffelen Ich machte die Annahme, dass, da der Kommentarknoten das commentDate hatte, das, was sie abrufen wollten. Wenn das nicht der Fall ist, wird meine Antwort nicht funktionieren. Ich denke, dass eine Klarstellung aus dem OP erforderlich ist. – Jay

1

Firebase kann verschachtelte Kinder abfragen, wenn Sie den gesamten Pfad kennen (so etwas wie dimensions/length). Es kann keine dynamischen Elemente in diesem Pfad unter jedem Kind behandeln (wie Ihre $commentid/commentDate).

Die einzige Möglichkeit, diese Funktion zu erhalten ist, die notwendigen Daten bis zu einer Höhe zu ziehen, wo Sie es abfragen können. Zum Beispiel, wenn Sie den Überblick über die lastCommentDate für jede Blog-Post halten:

{ 
    "-KGRZmSIDXz5hHkelthQ" : { 
    "something1" : "783151", 
    "something2" : "21", 
    "something3" : "wjeicisje ejej", 
    "comments" : "", 
    }, 
    "-KGRa5skGzA1GAG09Lno" : { 
    "something1" : "783151", 
    "something2" : "21", 
    "something3" : "wjeicisje ejej", 
    "comments" : "", 
    }, 
    "-KGVr-tti1zr1M1QLlHL" : { 
    "something1" : "783151", 
    "something2" : "21", 
    "something3" : "wjeicisje ejej", 
    "firstCommentDate": 1.461933727259896E9, 
    "lastCommentDate": 1.461941507496439E9, 
    "comments" : { 
     "-KGX1_rFSBLmQJ7QzCRc" : { 
     "commentBody" : "something", 
     "commentDate" : 1.461933727259896E9, 
     "commentOwnerImageView" : "something", 
     "commentOwnerName" : "something" 
     }, 
     "-KGX1r5Lnhv9YbQre6as" : { 
     "commentBody" : "something", 
     "commentDate" : 1.461933797884702E9, 
     "commentOwnerImageView" : "something", 
     "commentOwnerName" : "something" 
     }, 
     "-KGXVGKA0SYm-vRs6zsv" : { 
      "commentBody" : "something", 
     "commentDate" : 1.461941507496439E9, 
     "commentOwnerImageView" : "something", 
     "commentOwnerName" : "something" 
     }, 
    }, 
    } 
} 

Mit dieser Struktur können Sie Blog-Beiträge von ihrem letzten Kommentar Datum Abfrage:

ref.orderByChild('lastCommentDate').limitToLast(10).on(... 
+0

Hallo Frank, um wie oben gesagt sortieren zu können, muss ** commentDate (timelapse) ** unabhängig von der Zeitzone eindeutig sein? Wie kann ich einen eindeutigen Zeitstempel erstellen? Wenn ich Beispiel ** yyyyMMddHHmmss ** Format verwende, und dann orderByChild es, ich denke, es kann kompliziert sein, wird es mit limitToLast (10) falsches Ergebnis geben. – tobeiosdev

+1

Ich würde Zeitstempel anstelle eines bestimmten Datumsformats verwenden. Aber unabhängig davon: Wenn zwei Kommentare in derselben Sekunde/Millisekunde gepostet würden, würden beide das 'lastCommentDate' auf den gleichen Wert setzen. Das wird zu korrektem Verhalten führen. –