2016-06-13 4 views
6

Pracuję nad aplikacją dla systemu Android przy użyciu Firebase jako zaplecza. Jestem nowicjuszem w Firebase i utknąłem z powodu problemu, a problem pojawia się, gdy próbuję wyszukać rekord, używając zapytania startAt, zwraca wyniki, które nie zaczynają się od słowa kluczowego, które wpisuję.Android - Rozpoczęcie kwerendy FirebaseNie działa zgodnie z oczekiwaniami

Oto zestaw danych

itemname 
    -KK8vI8A5BZZp3Xo3FpA 
     name: "abc" 
    -KK8w3uoJdJ0hBSrq0CS 
     name: "test" 
    -KKAC1o9Vazyg9JLtDoQ 
     name: "dude" 

A oto kod snippit

Query query = firebase.child(Constants.KEY_ITEM_NAME).orderByChild("name").startAt("abc"); 
     query.addChildEventListener(new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
       Iterator<DataSnapshot> i = dataSnapshot.getChildren().iterator(); 
       while (i.hasNext()) { 
        DataSnapshot d = i.next(); 
        LOG(d.getKey(), d.getValue().toString()); 
       } 
      } 

Więc kiedy szukać abc odpowiedź obejmuje również test. Może robię coś złego lub idę źle. Czy ktoś może wskazać mi właściwy kierunek.

P. S Próbuję użyć elementu do znalezienia przedmiotów za pomocą AutocompleteTextView.

Dzięki

Odpowiedz

5

Po wywołaniu orderByChild("name").startAt("abc") rozkazy bazy danych wszystkie elementy według ich Nazwa obiektu, pomija te przed abc a następnie zwraca je wszystkie.

Jeśli tylko chce powrócić dzieci, które pasują abc, można użyć equalTo():

query = firebase.child(Constants.KEY_ITEM_NAME).orderByChild("name").equalTo("abc"); 
+0

Dziękuję za odpowiedź, tak Użyłem equalTo(), ale staram się korzystać z tej kwerendy w 'AutoCompleteTextView' i jeśli mam więcej rzeczy powiedzmy, że nazwy to 'abc',' abd', 'abe' i chcę wyszukać wszystkie rekordy zaczynające się od' ab'. Jak mogę to osiągnąć? – Max

+1

Próbowałem nawet używać w ten sposób 'firebase.child (" itemname "). OrderByKey(). StartAt (" a "). EndAt (" a \ uf8ff ");' Ale zerowa odpowiedź. – Max

+9

Działa, gdy używana jest '.orderByChild (" nazwa "). StartAt (" ab "). EndAt (" ab \ uf8ff ");' – Max

0

Niestety nie można robić, co chcesz. Zakładam, że szukana metoda to startsWith(), a nie startAt() (aby dopasować wszystkie wyrazy zaczynające się na podłańcuch). Ta metoda nie została jeszcze zaimplementowana w Firebase, szkoda.

Trzeba korzystać z usługi zewnętrznej jak ElasticSearch ale oznaczałoby to trzeba mieć serwer, który jest prawdopodobnie jednym z powodów rzeczywiście wykorzystać Firebase ... W każdym razie to jest link do wdrożenia ElasticSearch:

https://firebase.googleblog.com/2014/01/queries-part-2-advanced-searches-with.html

W przeciwnym razie musisz dowiedzieć się, jak pozbyć się paska wyszukiwania ...

Powodzenia!

0

pracował dla mnie:

 Query query = MyApplication.sReferenceOrders.orderByChild(Constants.STATUS).startAt("1").endAt("1\\uf8ff"); 
-1

Ja też szukałem tego rozwiązania, dzięki. Próbowałem ją i działa nawet z tym:

startAt('ab').endAt('ab\w|\W'); 
Powiązane problemy