2016-05-11 19 views
2

Grundsätzlich habe ich mit Firebase für die vergangene Woche gespielt, und ich stolperte kürzlich über die 'queryOrderedByChild()', die Sie so weit ich weiß - können Sie Daten in Firebase zu sortieren. Allerdings scheint ich nicht die richtigen Ergebnisse zu erhalten. Meine Daten Firebase sieht wie folgt aus:Firebase Abfrage Bestellung funktioniert nicht richtig

{ 
    "names" : { 
    "-KHVUwXdVPHmrO_O5kil" : { 
     "id" : "0", 
     "name" : "Jeff" 
    }, 
    "-KHVV7lCeac0cZNMi9fq" : { 
     "id" : "3", 
     "name" : "Stig" 
    }, 
    "-KHVVCjXgl0XxasVOHF1" : { 
     "id" : "13", 
     "name" : "Ali" 
    }, 
    "-KHVVJtyUO-yJZiompJO" : { 
     "id" : "7", 
     "name" : "Hannah" 
    }, 
    "-KHVVR8tMSO1Oh7R8tR1" : { 
     "id" : "2", 
     "name" : "Amanda" 
    } 
    } 
} 

, und mein Code sieht wie folgt aus:

ref.childByAppendingPath("names") 
    .queryOrderedByChild("id") 
    .observeEventType(.ChildAdded) { (snapshot:FDataSnapshot!) in 
     if let myID = snapshot.value["id"] as? String { 
      print(myID) 
     } 

Der Ausgang noch in einer zufälligen Reihenfolge ist, die Anzeige: 0, 2,7,1,8, 4 - Soll das nicht numerisch sein? Was mache ich falsch? Wie kann ich es so sortieren, dass es entweder aufsteigend oder absteigend numerisch wird?

+0

Ohne die Daten zu sehen, wird es sehr schwierig sein, etwas Konkretes zu sagen. Fügen Sie ein minimales Snippet des JSON hinzu, mit dem wir das Problem reproduzieren können. Fügen Sie es als Text hinzu, den Sie einfach erhalten, indem Sie im Firebase-Dashboard auf die Schaltfläche Exportieren klicken. –

+0

Hier ist der JSON-Code: '{ "Name": { "-KHVUwXdVPHmrO_O5kil": { "id": "0", "name": "Jeff" }, "-KHVV7lCeac0cZNMi9fq": { "id": "3", "name": "Stig" }, "-KHVVCjXgl0XxasVOHF1": { "id": "13", "name": "Ali" }, „-KHVVJtyUO -yJZiompJO ": { "id": "7" "name": "Hannah" }, "-KHVVR8tMSO1Oh7R8tR1": { "id": "2", " n ame ":" Amanda " } } } ' Und die Ausgabe ist nur in einer zufälligen Reihenfolge zeigt nur IDs. – askaale

+0

Es gibt einen Bearbeitungslink unter Ihrer Frage, so dass Sie ihn dort hinzufügen können.Dadurch können Sie es auch in einem besser lesbaren Format ablegen. –

Antwort

2

Sie sagen, dass Sie nach einer Zahl sortieren, aber der Wert Ihrer id -Eigenschaft wird als Zeichenfolge gespeichert.

Da Sie sie als Zeichenfolge speichern, werden sie in lexicographical order zurückgegeben.

Wenn Sie wollen, in numerischer Reihenfolge sein, sollten Sie sie als Nummern speichern

"-KHVUwXdVPHmrO_O5kil" : { 
    "id" : 0, 
    "name" : "Jeff" 
}, 

Alternativ können Sie auch die IDs als Nullen aufgefüllt Strings speichern können:

{ 
    "names" : { 
    "-KHVUwXdVPHmrO_O5kil" : { 
     "id" : "0", 
     "name" : "Jeff" 
    }, 
    "-KHVV7lCeac0cZNMi9fq" : { 
     "id" : "0003", 
     "name" : "Stig" 
    }, 
    "-KHVVCjXgl0XxasVOHF1" : { 
     "id" : "0013", 
     "name" : "Ali" 
    }, 
    "-KHVVJtyUO-yJZiompJO" : { 
     "id" : "0007", 
     "name" : "Hannah" 
    }, 
    "-KHVVR8tMSO1Oh7R8tR1" : { 
     "id" : "0002", 
     "name" : "Amanda" 
    } 
    } 
} 

Da die Saiten Sind alle gleich lang, werden sie in der richtigen Reihenfolge sortiert. Aber Sie müssen sich bei der letzteren Lösung für die Länge des Strings/maximalen ID-Wertes entscheiden, also scheint es schlimmer zu sein.

+0

Danke für das Aussortieren für mich! Weißt du, ob das für einen 'Double' funktionieren würde? Nehmen wir an, ich möchte einen neuen Post absteigend anzeigen lassen (die Abfrage nach einem Zeitstempel von Double sortieren), wäre das möglich? Und wenn ich das tun würde - könnte ich stattdessen queryLimitedToLast oder beides verwenden? Vielen Dank im Voraus - und natürlich danke, dass Sie das für mich erledigt haben. Ich muss sagen, dass mir dieses Missverständnis etwas peinlich ist. – askaale

+0

Wenn Sie die Doubles als String speichern, haben Sie das gleiche Problem. Aber Zeitstempel sind typischerweise Millisekunden seit der Epoche, also normale Zahlen (nicht fließende Punkte), –

+0

Sieht aus, als würde Firebase den Double-Wert nicht anordnen, selbst wenn er doppelt gespeichert ist? Was würden Sie vorschlagen, um Daten zu implementieren, um das Datum eines Posts zu verfolgen, der von einem Benutzer gesendet wird, um dann in-App gelesen zu werden, wie lange es schon gepostet wurde? – askaale

0

Wenn Sie Bestellung von Kind verwenden, werden Sie Ihre id bestellen Sie nicht zu berühren, es ist Wert.

Dann haben Sie vielleicht so etwas wie

  • (FIRDatabaseQuery *) queryOrderedByValue
    queryOrderedByValue versuchen: verwendet wird, einen Verweis auf einen Blick auf die Daten zu erzeugen, die von untergeordnetem Wert sortiert worden ist.
Verwandte Themen