2015-06-01 8 views
36

Ich habe nach einer Möglichkeit gesucht, die Daten eines Kindobjekts in Android Firebase zu erhalten. Ich habe Dinge wie Firebase retrieve child Android gefunden. Alle Lösungen schlagen vor, einen "ChildEventListener" zu verwenden, aber ich muss diese Daten in diesem Moment abrufen, nicht wenn sie verschoben, gelöscht, aktualisiert werden, und so weiter.Android Firebase, einfach erhalten ein Kind Objektdaten

Meine Daten werden in https: //.firebaseio.de/users//creation als String gespeichert. Ich denke, es muss einen einfachen Weg geben, auf das zuzugreifen, ohne zu viel tun zu müssen, denn wenn ich die genaue URL in meinen Browser kopiere, sehe ich das: 'creation: "2015/05/31 21:33:55' ' genau dort in meinem "Firebase Forge Dashboard".

Wenn jemand weiß, wie man ohne einen Hörer auf eine Änderung zugreifen kann, würde das geschätzt werden!

Vielen Dank!

Antwort

44

Firebase-Listener werden sowohl für die anfänglichen Daten als auch für alle Änderungen ausgelöst.

Wenn Sie die Daten in einer Sammlung synchronisieren möchten, verwenden Sie ChildEventListener. Wenn Sie ein einzelnes Objekt synchronisieren möchten, verwenden Sie ValueEventListener. Beachten Sie, dass Sie in beiden Fällen die Daten nicht "bekommen". Sie synchronisieren es, was bedeutet, dass der Rückruf mehrmals aufgerufen werden kann: für die Anfangsdaten und wann immer die Daten aktualisiert werden.

Dies ist in Firebase's quickstart guide for Android abgedeckt. Der entsprechende Code und Zitat:

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) {   
    } 
}); 

In dem obigen Beispiel wird der Wert Ereignis einmal Feuer für den Anfangszustand der Daten, und dann wieder jedes Mal, wenn der Wert dieser Daten ändern.

Bitte verbringen Sie ein paar Momente, um durch diesen schnellen Start zu gehen. Es sollte nicht länger als 15 Minuten dauern und es wird Sie vor viel Kopfkratzen und Fragen bewahren. Die Firebase Android Guide ist wahrscheinlich ein gutes nächstes Ziel, speziell für diese Frage: https://firebase.google.com/docs/database/android/read-and-write

+1

Vielen Dank! Du warst eine große Hilfe! – 26hmkk

+0

Danke, funktioniert perfekt. –

17

Sie nicht direkt einen Wert lesen. Sie können es mit .setValue() festlegen, aber es gibt keine .getValue() für das Referenzobjekt.

Sie müssen einen Listener verwenden. Wenn Sie den Wert nur einmal lesen möchten, verwenden Sie ref.addListenerForSingleValueEvent().

Beispiel:

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) { 

    } 
}); 

Quelle: https://www.firebase.com/docs/android/guide/retrieving-data.html#section-reading-once

+2

Dies ist die Antwort, die die Frage genauer beantwortet, da es keine einfache Codezeile gibt, um ein Bit Daten in Ihrer Firebase-Datenbank nur einmal abzurufen, wie '.getValue()'. Es sagt dann, wie Sie es tun müssen, '.addListenerForSingleValueEvent', mit einer Referenz. Hinweis 'FirebaseError' wurde auf den allgemeineren 'DatabaseError' herabgesetzt. – Androidcoder

8

Ich speichere meine Daten auf diese Weise:

accountsTable -> 
    key1 -> account1 
    key2 -> account2 

um Objektdaten zu erhalten:

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

nur holen spezifischer Knoten Daten und seine Arbeit perfekt für mich

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

kann ich nur direkt datasnapshot, child ("email"). GetValue()? , ich meine, ohne datasnapshot.getChildren() –

+1

nein ist es nicht möglich, –

Verwandte Themen