2015-06-01 11 views
36

Szukałem sposobu, aby uzyskać dane jednego obiektu dziecka w Android Firebase.Android Firebase, po prostu uzyskaj dane jednego obiektu podrzędnego

Znalazłem rzeczy takie jak Firebase retrieve child Android. Wszystkie rozwiązania sugerują użycie "ChildEventListener", jednak muszę w tej chwili uzyskać te dane, a nie kiedy są przenoszone, usuwane, aktualizowane itp.

Moje dane są przechowywane w https: //.firebaseio.com/users//creation jako ciąg. Sądzę, że musi istnieć prosty sposób, aby uzyskać do nich dostęp bez konieczności wykonywania zbyt wielu czynności, ponieważ jeśli skopiuję dokładny adres URL do przeglądarki, widzę: "tworzenie:" 2015/05/31 21:33:55 " właśnie tam w moim "Firebase Forge Dashboard".

Jeśli ktokolwiek wie, jak uzyskać dostęp do tego bez słuchacza w celu zmiany, która byłaby doceniona!

Dziękujemy!

Odpowiedz

44

Słuchacze Firebase uruchamiają zarówno dane początkowe, jak i wszelkie zmiany.

Jeśli chcesz zsynchronizować dane w kolekcji, użyj ChildEventListener. Jeśli chcesz zsynchronizować pojedynczy obiekt, użyj ValueEventListener. Zwróć uwagę, że w obu przypadkach nie "dostajesz" danych. Synchronizujesz to, co oznacza, że ​​wywołanie zwrotne może zostać wywołane wiele razy: dla danych początkowych i zawsze, gdy dane zostaną zaktualizowane.

Jest to objęte Firebase's quickstart guide for Android. Odpowiedni kod i cytuję:

FirebaseRef.child("message").addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot snapshot) { 
    System.out.println(snapshot.getValue()); //prints "Do you have data? You'll love Firebase." 
    } 
    @Override 
    public void onCancelled(DatabaseError databaseError) {   
    } 
}); 

W powyższym przykładzie, zdarzenie wartość zadziała raz dla początkowego stanu danych, a następnie ponownie za każdym razem wartość, że zmiany danych.

Poświęć kilka chwil na szybki start. To nie powinno zająć więcej niż 15 minut, a zaoszczędzi ci to dużo drapania głowy i pytań. Numer Firebase Android Guide jest prawdopodobnie dobrym następnym celem, szczególnie w przypadku tego pytania: https://firebase.google.com/docs/database/android/read-and-write

+1

Dzięki! Byłeś wielką pomocą! – 26hmkk

+0

Dzięki, działa idealnie. –

17

Nie czytasz bezpośrednio wartości. Można go ustawić za pomocą .setValue(), ale nie ma wartości .getValue() na obiekcie odniesienia.

Musisz użyć odbiornika. Jeśli chcesz raz przeczytać wartość, użyjesz ref.addListenerForSingleValueEvent().

Przykład:

Firebase ref = new Firebase("YOUR-URL-HERE/PATH/TO/YOUR/STUFF"); 
ref.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     String value = (String) dataSnapshot.getValue(); 

     // do your stuff here with value 

    } 

    @Override 
    public void onCancelled(FirebaseError firebaseError) { 

    } 
}); 

Źródło: https://www.firebase.com/docs/android/guide/retrieving-data.html#section-reading-once

+2

To jest odpowiedź, która bardziej szczegółowo odpowiada na pytanie, ponieważ nie ma prostego sposobu na jedną linię kodu, aby pobrać trochę danych w bazie danych bazy danych tylko raz, na przykład ".getValue()". Następnie mówi, jak to zrobić, ".addListenerForSingleValueEvent", z odniesieniem. Uwaga "FirebaseError" został zamortyzowany do bardziej ogólnego "DatabaseError". – Androidcoder

8

przechowywać moje dane w ten sposób:

accountsTable -> 
    key1 -> account1 
    key2 -> account2 

aby uzyskać dane obiektu:

accountsDb = mDatabase.child("accountsTable"); 

accountsDb.child("some key").addListenerForSingleValueEvent(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot snapshot) { 

        try{ 

         Account account = snapshot.getChildren().iterator().next() 
            .getValue(Account.class); 


        } catch (Throwable e) { 
         MyLogger.error(this, "onCreate eror", e); 
        } 
       } 
       @Override public void onCancelled(DatabaseError error) { } 
      }); 
9

tylko pobrać określony węzeł dane i ich działanie są dla mnie idealne

mFirebaseInstance.getReference("yourNodeName").getRef().addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 


     for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { 
      Log.e(TAG, "======="+postSnapshot.child("email").getValue()); 
      Log.e(TAG, "======="+postSnapshot.child("name").getValue()); 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError error) { 
     // Failed to read value 
     Log.e(TAG, "Failed to read app title value.", error.toException()); 
    } 
}); 
+0

Czy mogę tylko bezpośrednio użyć datasnapshot, dziecko ("e-mail"). GetValue()? mam na myśli bez użycia datasnapshot.getChildren() –

+1

nie jest to niemożliwe, –

Powiązane problemy