2016-09-22 22 views
7

Zasadniczo mam strukturę nazywaną, tematy, która zawiera Title, Description i flagę Published (patrz zrzut ekranu poniżej w celu wyjaśnienia).Jak filtrować dane Firebase w Swift?

Topics object in Firebase Database

W aplikacji, chcę, aby filtrować dane i wyświetlić tylko tematy, które mają published = true.

To właśnie staram się robić:

self.ref = FIRDatabase.database().referenceFromURL(FIREBASE_URL).child("topics") 
     self.ref?.queryEqualToValue("published") 
     self.ref?.observeEventType(.Value, withBlock: { (snapshot) in 
      //...Handle Snapshot here 
     }) 

Ale to nie działa. Jak mam się do tego podejść? Z góry dziękuję za pomoc.

Odpowiedz

16

Masz tam kilka małych błędów. Ogólnie nie jest tak źle, ale łączy ich nigdy nie działa:

  1. wywołanie którejkolwiek z metod query... zwraca nowy obiekt
  2. trzeba orderByChild() zanim można filtrować jego wartości
  3. trzeba pętli nad wynikami

Łącząc te:

let ref = FIRDatabase.database().referenceFromURL(FIREBASE_URL).child("topics") 
let query = ref.queryOrderedByChild("published").queryEqualToValue(true) 
query.observeEventType(.Value, withBlock: { (snapshot) in 
    for childSnapshot in snapshot.children { 
     print(childSnapshot) 
    } 
}) 

Otrzymujemy to pytanie regularnie. Na przykład, to od wczoraj wygląda bardzo podobnie: Firebase Query not Executing Properly. Ponieważ moje wyjaśnienie różni się w zależności od każdej odpowiedzi, polecam trochę przeczytać, aby przeczytać moją relevant answers, aż kliknie.

+0

To było to! Jeszcze raz dziękuję za pomoc, Frank! –

+0

Czy nadal jest możliwe, jeśli dane zostały zagnieżdżone o jeden poziom głębiej. Na przykład, jeśli pod "opublikowany" znajduje się lista kluczy z wartościami true/false. A chciałeś filtrować według '/ published/key1 = true' To jest problem, na który napotykam. –

+0

Próbowałem tego, ale otrzymuję wszystkie wartości podrzędne, a nie tylko te, które spełniają kryteria zapytania. Używam .childAdded i queryStarting (at :). Z góry dziękuję za wszelkie wskazówki. – Septronic

0
self.ref = FIRDatabase.database().referenceFromURL(FIREBASE_URL).child("topics"). 
    queryOrderedByChild("published").queryEqualToValue(true) 
    .observeEventType(.Value, withBlock: { (snapshot) in 
    for childSnapshot in snapshot.children { 
     print(snapshot) 
    } 
}) 
Powiązane problemy