Recuperación de datos específicos de FireBase (Android)

Estoy haciendo una aplicación de chat, y tengo una Firebase con la siguiente estructura. Chat1, Chat2, Chat3 … se utiliza para guardar datos de diferentes grupos de chat. Mensaje1, Mensaje2, Mensaje3 son Mensajes dentro del primer grupo., Puede ser de cualquier autor.

Charlas

  • Chat1
    • Message1
      • Autor1
      • Mensaje de texto
    • Message2
      • Autor2
      • Mensaje de texto
    • Message3
      • Autor1
      • Mensaje de texto
  • Chat2
    • Message1
      • Autor3
      • Mensaje de texto
    • Message2
      • Autor4
      • Mensaje de texto
    • Message3
      • Autor1
      • Mensaje de texto
  • Chat3

Quiero recuperar la lista de todos los mensajes de "Autor 1". Significado Message1, Message3 debe ser recuperado de Chat1 y Message3 también debe ser recuperado de Chat2. Quiero mostrar todos los mensajes de 1 autor.

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

Esto me da datos enteros! ¿Cómo puedo restringirlo a "Author1"?

Firebase siempre recuperará el nodo completo que solicita. Puesto que usted está pidiendo todos los chats o un chat entero a la vez (no está claro cuál usted hace de su código), eso es lo que usted consigue.

Si desea obtener menos datos de Firebase, tendrá que ser más específico en lo que pide de ella. Por ejemplo, si desea mostrar Chat1, comience escuchando a los niños del nodo Chat1.

Este fragmento proviene de la guía Firebase para 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. }); 

Este fragmento realiza lo mismo que su ejemplo actual, pero en lugar de su código de bucle sobre los datos con un for , Firebase le alimenta el mensaje de datos de un mensaje a la vez.

Con eso en su lugar, puede filtrar los mensajes. Este es un proceso de dos pasos: primero se ordena por un nodo secundario y, a continuación, se limitan los nodos que se devuelven.

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

Este último bit se explica mejor en la documentación de Firebase sobre las consultas .

Puede utilizar la consulta para filtrar los resultados

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

Además, puede utilizar otros métodos de filtro aquí: https://firebase.google.com/docs/reference/android/com/google/firebase/database/Query

No sé si esto es lo que querías decir o no, pero aquí está mi código para mi base de datos. Primero aquí está mi estructura de base de datos:

* Raíz de la base de datos

: Usuarios

:

nombre de usuario

::

:: …… "Nombre": "valor"

:: …… "E-mail": "valor"

:: …… "Contraseña": "valor"

:

nombre de usuario

::

:: …… "Nombre": "valor"

:: …… "E-mail": "valor"

:: …… "Contraseña": "valor"

Aquí está mi código para recuperar los datos de la base de datos:

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

Aquí la clase User.java contiene 3 valores de cadena de correo electrónico, contraseña y nombre.

 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; } } 
  • Android 6.0 (Marshmallow): Cómo jugar notas de midi?
  • Fuga de memoria de Android: InputMethodManager, mapa de bits
  • Diferencia entre AAR, JAR, DEX, APK en Android
  • Actividad se ha filtrado ventana com.android.internal.policy.impl.PhoneWindow$DecorView@46029dd0
  • Android Studio: Código de error 1: Gradle: Error de ejecución para la tarea ': app: processDebugResources'
  • Patrón MVC en Android
  • android Apache httpclient archivo de carga ,. tiene algún error de reensamble TCP extraño
  • Mostrar sólo dos dígitos después de decimal
  • Android Google map Excepción de puntero nulo al agregar marcador
  • Excepción terminada handshake de https de Android
  • ¿La alerta no aparece desde la vista web en android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.