web-dev-qa-db-fra.com

Récupération de données spécifiques à partir de FireBase (Android)

Je fais une application de chat et j'ai une base de feu avec la structure suivante. Chat1, Chat2, Chat3 ... est utilisé pour enregistrer les données de différents groupes de conversation. Message1, Message2, Message3 sont des messages du 1er groupe., Il peut s'agir de n'importe quel auteur. 

Chats

  • Chat1
    • Message1
      • Auteur1
      • MessageText
    • Message2
      • Auteur2
      • MessageText
    • Message3
      • Auteur1
      • MessageText
  • Chat2
    • Message1
      • Auteur3
      • MessageText
    • Message2
      • Auteur4
      • MessageText
    • Message3
      • Auteur1
      • MessageText
  • Chat3

Je souhaite récupérer la liste de tous les messages de "Auteur 1". Signification Message1, Message3 doit être récupéré à partir de Chat1 et Message3 doit également être extrait à partir de Chat2. Je souhaite afficher tous les messages d'un auteur. 

ref = new Firebase(FIREBASE_URL); //Root URL

ref.addValueEventListener(new ValueEventListener() {

    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
         for (DataSnapshot child : dataSnapshot.getChildren()) {
                 for (DataSnapshot childd : child.getChildren()) {
                     //This might work but it retrieves all the data
                    }
                }
    }

    @Override
    public void onCancelled() {

    }
});

Cela me donne des données entières! Comment puis-je le limiter à "Author1"? 

4
engico

Firebase récupérera toujours le ou les nœuds complets que vous demandez. Puisque vous demandez tous les chats ou un chat entier à la fois (vous ne pouvez pas savoir ce que vous faites à partir de votre code), c'est ce que vous obtenez.

Si vous souhaitez obtenir moins de données de Firebase, vous devrez être plus précis dans ce que vous lui demandez. Par exemple, si vous souhaitez afficher Chat1, commencez par écouter les enfants du nœud Chat1.

Cet extrait provient du Guide Firebase pour Android :

// Retrieve new posts as they are added to Firebase
ref.addChildEventListener(new ChildEventListener() {
    // Retrieve new posts as they are added to Firebase
    @Override
    public void onChildAdded(DataSnapshot snapshot, String previousChildKey) {
        Map<String, Object> newPost = (Map<String, Object>) snapshot.getValue();
        System.out.println("Author: " + newPost.get("author"));
        System.out.println("Title: " + newPost.get("title"));
    }
    //... ChildEventListener also defines onChildChanged, onChildRemoved,
    //    onChildMoved and onCanceled, covered in later sections.
});

Cet extrait est identique à votre exemple actuel, mais au lieu de laisser votre code boucler sur les données avec une variable for, Firebase vous alimente les données un message à la fois.

Avec cela en place, vous pouvez filtrer les messages. Il s’agit d’un processus en deux étapes: d’abord, vous commandez par un nœud enfant, puis vous limitez le nombre de nœuds renvoyés.

Query query = ref.orderByChild("Author").equalTo("Author1", "Author");
query.addChildEventListener(new ChildEventListener() {
    // the rest of the code remains the same as above

Ce dernier bit est mieux expliqué dans la documentation de Firebase sur les requêtes .

11
Frank van Puffelen

Je ne sais pas si c'est ce que vous vouliez dire ou pas, mais voici mon code pour ma base de données. Tout d'abord voici ma structure de base de données:

* Racine de la base de données

:Utilisateurs

:

: .... nom d'utilisateur1

::

:: ...... "Nom": "valeur"

:: ...... "Email": "valeur"

:: ...... "Mot de passe": "valeur"

:

: .... nom d'utilisateur2

::

:: ...... "Nom": "valeur"

:: ...... "Email": "valeur"

:: ...... "Mot de passe": "valeur"

Voici mon code pour récupérer les données de la base de données:

FirebaseDatabase database= FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference().child("Users");

login=myRef.child(name); //here user will sign in using his name so it is based on user, directory will change dynamically
ValueEventListener listener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            User user = dataSnapshot.getValue(User.class);

            String demo=user.Email;
            //email fetched from database
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    };
    login.addValueEventListener(listener);

Ici, la classe User.Java contient 3 valeurs de chaîne: email, mot de passe et nom.

public class User {

public String Name;
public String Email;
public String Password;

public User() {
    // Default constructor required for calls to DataSnapshot.getValue(User.class)
}

public User(String name,String pass, String email) {
    this.Name = name;
    this.Email = email;
    this.Password = pass;
}
}
1
user7330119

Vous pouvez utiliser la requête pour filtrer les résultats

DatabaseReference mDatabaseReference = FirebaseDatabase.getInstance().getReference("Chat1");
   Query query =  mDatabaseReference.orderByChild("authorName").equalTo("Author1");

De plus, d'autres méthodes de filtrage peuvent être données ici: https://firebase.google.com/docs/reference/Android/com/google/firebase/database/Query

1
Pramod Garg