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
- Comportamiento del ciclo de vida del fragmento extraño: onCreate llamado dos veces
- Android reconocimiento de voz: startActivityForResult () no funciona
- El método takeRequest () de MockWebServer tarda mucho en responder o se bloquea
- String.equals () con varias condiciones (y una acción en el resultado)
- Actualizar variables estáticas en java
- Chat1
- Message1
- Autor1
- Mensaje de texto
- Message2
- Autor2
- Mensaje de texto
- Message3
- Autor1
- Mensaje de texto
- Message1
- Chat2
- Message1
- Autor3
- Mensaje de texto
- Message2
- Autor4
- Mensaje de texto
- Message3
- Autor1
- Mensaje de texto
- Message1
- 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"?
- Obtenga el tamaño de RAM total que utiliza Aplicación en Android
- Cliente de Java java puro
- Android FragmentTransaction setTransitionStyle
- ¿Cómo saber cuándo se amplía el menú de la barra de acción?
- Cuál es la mejor aproximación para enviar grandes paquetes UDP en secuencia
- Firebase cláusula WHERE múltiple en la consulta
- Android Intent Context Confusing
- JSONObject.toString: cómo no escapar de barras
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; } }
- MotionEvent.ACTION_DOWN en Android es demasiado sensible. Este evento se recibe incluso si la pantalla es simplemente tocado por un momento
- ¿Cómo puedo hacer que LibGDX detecte un solo toque / clic?