2016-08-11 1 views
1

Ich habe eine DB-Struktur Firebase wie folgt:Serverseitige Filterung von Daten Firebase

{ 
    "listings" : { 
    "-KOt8OUGkUphoMyqEXJ2" : { 
     "created" : 1470911323208, 
     "ends" : 1470911323209, 
     "make" : "LONDON TAXIS INT", 
     "model" : "TX4 BRONZE", 
     "status" : "For Sale", 
    }, 
    "-KOt97_P8sJW7woED4aH" : { 
     "created" : 1470911515115, 
     "ends" : 1471775515000, 
     "make" : "NISSAN", 
     "model" : "QASHQAI N-TEC", 
     "status" : "For Sale", 
    }, 
    "-KOt_BYYUEaXu_LNvnUv" : { 
     "created" : 1470918609414, 
     "ends" : 1471782609000, 
     "make" : "MAZDA", 
     "model" : "3 TS", 
     "status" : "For Sale", 
    } 
    } 
} 

Ich benutze GeoFire Schlüssel für Inserate in einem bestimmten Radius zu erhalten. Ich verwende dann observeSingleEventOfType, um die Auflistung für den Schlüssel zurückzugeben. Das alles funktioniert gut.

Allerdings möchte ich nur eine Liste zurückgeben, wenn der "Timestamp"> aktuelle Zeit "endet". Ich habe den folgenden Ansatz versucht:

geoQueryHandle = geoQuery.observeEventType(.KeyEntered, withBlock: {(key, location) in 

     let listingRef = self.ref.child("listings").child(key) 
     let now = Int(NSDate().timeIntervalSince1970 * 1000) 
     let query = listingRef.queryStartingAtValue(now, childKey: "ends") 

     query.observeSingleEventOfType(.Value, withBlock: {snapshot in 

      if let listing = Listing(snapshot: snapshot, location: location) { 
       //...populate my tableview 
      } 
     } 
}) 

Kann mir jemand empfehlen, warum meine Abfrage nicht funktioniert?

Dank

+0

Können Sie erweitern auf "funktioniert nicht"? Wird der withBlock nicht ausgeführt, oder erhalten Sie nicht den erwarteten Snapshot oder etwas anderes? –

+0

Hallo Travis, sorry für das "funktioniert nicht" ... um zu verdeutlichen, dass der withBlock nicht ausgeführt wird. – AlexM

Antwort

0

Firebase Abfragen anwenden Bestellung/Filterung auf die Eigenschaften der untergeordneten Knoten des Ortes, wo Sie sie ausführen.

queryLocation 
    child1 
    filterProperty: filterValue 
    child2 
    filterProperty: filterValue 

Da Ihr listingRef bereits auf einen bestimmten Eintrag verweist, die Reihenfolge/Filter, den Sie Kind gelten Hinzufügen von Knoten eine Ebene tiefer.

Der einfachste Weg, um Ihren Anwendungsfall zum Laufen zu bringen scheint einfach den Knoten Client-Seite zu filtern:

let listingRef = self.ref.child("listings").child(key) 

query.observeSingleEventOfType(.Value, withBlock: {snapshot in 
    if let listing = Listing(snapshot: snapshot, location: location) { 
     let now = Int(NSDate().timeIntervalSince1970 * 1000) 
     // TODO: exit if snapshot.child("ends").getValue() < now 
     //...populate my tableview 
    } 
} 

Ein komplexer, aber effizienter Weg, dies die abgelaufenen Ereignisse entfernen zu bewerkstelligen wäre vom Geofire-Standort.

+0

Danke für die Antwort Frank. Meine aktuelle Lösung verwendet die Filterung auf der Client-Seite genau so, wie Sie es beschreiben. Ich habe auch nachgesehen, wie die abgelaufenen Ereignisse vom GeoFire-Standort entfernt wurden. Es ist jedoch möglich, die Entfernung auszulösen, wenn der Zeitstempel "Ende" abgelaufen ist. Ich nehme an (ohne irgendeinen menschlichen Eingriff in die App), dass dies durch einen Server-seitigen Prozess erfolgen müsste, der alle Einträge durchläuft, die nach abgelaufenen Datensätzen suchen, und den Geofire-Standort löscht? – AlexM

+0

Es könnte leicht clientseitig gemacht werden, einfach den Client entfernen den Schlüssel, wenn es ein Ereignis trifft, das abgelaufen ist. Wenn das genau in die Methode passen würde, die Sie bereits haben. Da es sich um eine Entfernungsoperation handelt, werden mehrere Clients, die dieselbe Operation ausführen, keinen Unterschied machen. –

+0

Ich war ein wenig besorgt über mögliche Auswirkungen auf die Sicherheit der Daten ... aber nachdem ich darüber nachgedacht habe, glaube ich nicht, dass es wichtig ist. Danke für den Vorschlag, werde es versuchen. – AlexM

Verwandte Themen