2016-07-29 10 views
7

Jestem nowy firebase i nosql bazieJak odzyskać konkretną listę danych z Firebase

Próbuję odzyskać jakieś konkretne dane z Firebase. Mam węzeł universities i ten węzeł ma wiele unikalnych identyfikatorów jako węzeł, który ma więcej danych do niego. Chcę pobrać name z każdego węzła.

Proszę spojrzeć na to.

enter image description here

Co próbowałem dotąd: Próbowałem za pomocą addChildEventListener ale to tylko słucha pierwszego dziecka. Debugowałem go i pokazywałem tylko wartości pierwszego potomka węzła universities.

myRef.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      List<University> university = new ArrayList<>(); 
      Map<String, Object> td = (HashMap<String, Object>) dataSnapshot.getValue(); 

      Log.d("TAG",dataSnapshot.getValue().toString()); 
     } 

     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 

     } 

     @Override 
     public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

Próbowałem również addValueEventListener. To nasłuchuje całego węzła i zwraca całe dane, ale nie mogę wyodrębnić dla niego "nazwy", ponieważ zawiera on unikalne identyfikatory.

Proszę mnie we właściwym kierunku.

myRef.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       University university = dataSnapshot.getValue(University.class); 
       List<University> universities = (List<University>) dataSnapshot.getValue(University.class); 
       *//*List<String> lst = new ArrayList<String>(); 

      for(DataSnapshot dsp : dataSnapshot.getChildren()){ 
       lst.add(dsp.getKey()); 
      } 
      Log.d("TAG",lst.toString());*//* 

      Map<String, Object> td = (HashMap<String, Object>) dataSnapshot.getValue(); 


      *//*List<Object> values = new ArrayList<Object>(td.values()); 
      List<String> list=new ArrayList<String>(); 
      for(int i=0; i<values.size(); i++){ 
       list.add((String) values.get(i)); 
      }*//* 
      Log.d("TAG", university.toString()); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

Odpowiedz

13

Jeśli używasz addValueEventListener dla pobrać wszystkie uniwersytet z Firebase

List<University> universityList = new ArrayList<>(); 
myRef.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot snapshot) { 
     universityList.clear(); 
     for (DataSnapshot postSnapshot: snapshot.getChildren()) { 
      University university = postSnapshot.getValue(University.class); 
      universityList.add(university); 

      // here you can access to name property like university.name 

     } 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 
     System.out.println("The read failed: " + firebaseError.getMessage()); 
    } 
}); 

Lub jeśli używasz addChildEventListener

List<University> universityList = new ArrayList<>(); 
myRef.addChildEventListener(new ChildEventListener() { 
    @Override 
    public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
     University university = dataSnapshot.getValue(University.class); 
     universityList.add(university); 
     Log.i(TAG,"add university name = " + university.name); 
     ... 
    } 
    ... 
} 
+0

ok użyłem pierwszej metody. Ta metoda. Przechowuj dane hashMap w liście. Mam na myśli to, że ma teraz 3 indeksy. A każdy indeks zawiera dane typu HashMap. I chcę uzyskać z tego nazwę. jak bym to zrobił? –

+0

Widzę, że sposób użycia w twoim poście jest inny. w moim kodzie (w jednej metodzie), wewnątrz pętli for otrzymasz obiekt Univerty i możesz uzyskać dostęp do właściwości name przez university.name –

+0

dzięki ci, pomógł –

1

Można użyć equalTo() z Query w którym można przekazać swój własny ciąg pasujące z Firebase bazie.

jak ten sposób można tworzyć zapytanie i ustaw słuchacza z tego

Query queryRef = myFirebaseRef.orderByChild("name").equalTo("some name"); 

odnoszą this nić więcej.

Here jest ładny przykład z Firebase urzędników, patrz że a dostaniesz jasne wyobrażenie

+0

Czy to zapytanie zwróci mi nazwę z każdego węzła podrzędnego uczelni? '' 'Zapytanie queryRef = myFirebaseRef.orderByChild (" name ")' ''? –

+0

@Zeeshan Shabbir Nie, spowoduje zwrócenie wszystkich użytkowników uporządkowanych według wartości nazwy właściwości. – MeLine