web-dev-qa-db-fra.com

Android Firebase, obtenez simplement les données d'un objet enfant

Je cherchais un moyen d'obtenir les données d'un objet enfant dans Android Firebase.

J'ai trouvé des choses comme Firebase récupérer enfant Android . Toutes les solutions suggèrent d'utiliser un "ChildEventListener", cependant, je dois obtenir ces données à ce moment-ci, pas quand elles sont déplacées, supprimées, mises à jour, etc.

Mes données sont conservées dans https: //.firebaseio.com/users//creation sous forme de chaîne. Je suppose qu’il doit exister un moyen simple d’y accéder sans avoir à en faire trop, car si je copie l’URL exacte dans mon navigateur, je peux voir le: 'creation: "2015/05/31 21:33:55"' juste là dans mon "Dashboard Firebase Forge".

Comment puis-je accéder à cela sans auditeur?

48
26hmkk

Les écouteurs Firebase se déclenchent à la fois pour les données initiales et toutes les modifications.

Si vous souhaitez synchroniser les données d'une collection, utilisez ChildEventListener. Si vous souhaitez synchroniser un seul objet, utilisez ValueEventListener. Notez que dans les deux cas, vous ne "récupérez" pas les données. Vous le synchronisez, ce qui signifie que le rappel peut être appelé plusieurs fois: pour les données initiales et chaque fois que les données sont mises à jour.

Ceci est couvert dans Guide de démarrage rapide de Firebase pour Android . Le code et la citation pertinents:

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

Dans l'exemple ci-dessus, l'événement value sera déclenché une fois pour l'état initial des données, puis à chaque fois que la valeur de ces données change.

Veuillez prendre quelques instants pour passer à travers ce démarrage rapide. Cela ne devrait pas prendre plus de 15 minutes et cela vous évitera beaucoup de grattage de tête et de questions. Le Firebase Android Guide est probablement une bonne destination pour cette question, en particulier: https://firebase.google.com/docs/database/Android/read -et-write

57

Vous ne lisez pas directement une valeur. Vous pouvez le définir avec .setValue(), mais il n'y a pas de .getValue () sur l'objet de référence.

Vous devez utiliser un auditeur. Si vous voulez juste lire la valeur une fois, utilisez ref.addListenerForSingleValueEvent().

Exemple:

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

   }
});

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

22
lenooh

juste chercher des données de nœud spécifiques et son fonctionnement parfait pour moi

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());
    }
});
11
tej shah

Je stocke mes données de cette façon:

accountsTable ->
  key1 -> account1
  key2 -> account2

afin d'obtenir des données d'objet:

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) { }
            });
10
bat-el.g