Pedido de datos con Firebase Android
Estoy corriendo en un extraño problemas en el que una consulta de Firebase utilizando orderByChild()
no ordena realmente los datos. A continuación se muestra una instantánea de los datos que estoy tratando de ordenar: (total está apagado por el bien de este ejemplo)
- ¿Soporta / soportará Google NDK C ++ falla en Firebase Crash Reporting?
- Firebase que envía varias notificaciones push en lugar de apilar o reemplazar
- Firebase: Consulta para excluir datos basados en una condición
- Cómo obtener la clave del valor en firebase
- Firebase FCM force onTokenRefresh () para ser llamado
Este es el código que he usado hasta ahora:
Query query = locationComment.orderByKey(); query.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if (dataSnapshot.getValue() == null) { return; } data.clear(); adapter.notifyDataSetChanged(); String userId; String time; String comment; Map<String, String> commentMap = (Map) dataSnapshot.getValue(); for (Map.Entry<String, String> entry : commentMap.entrySet()) { if(!((entry.getKey()).contains("total"))) { String[] keyString = (entry.getKey()).split(","); time = keyString[0]; userId = keyString[1]; comment = entry.getValue(); Date resultdate = new Date(Integer.parseInt(time)); data.add(new Comment(comment, DateFormat.getDateTimeInstance().format(resultdate), userId)); adapter.notifyItemInserted(data.size()); } } } @Override public void onCancelled(DatabaseError databaseError) { } });
Estoy recibiendo cada par de valores clave (salvo el total), excepto que no está en orden según lo esperado (ordenado por clave). Los documentos Firebase dicen que las claves se ordenan lexicográficamente si no se pueden analizar en un entero de 32 bits.
De cualquier manera, aunque el orden debe ser como se muestra en la imagen, pero los datos que me devuelve mientras que bucle a través del mapa no está en este orden.
Realmente agradecería que alguien me señalara en la dirección correcta. ¡Gracias!
- ¿Qué es FCM token en Firebase?
- ¿Cómo agregar más elementos a FirebaseRecyclerAdapter?
- ¿Cómo puedo utilizar el mensaje de la nube Firebase en un proyecto eclipse?
- Cargando más elementos en el usuario desplazarse con FirebaseIndexRecyclerAdapter
- ¿Sólo rellenar viewHolder con mensajes recuperados de la base de datos?
- Permiso de Firebase negado Error
- ¿Cómo enviar notificación al cliente cuando Firebase tiene una nueva entrada?
- Firebase Android addListenerForSingleValueEvent a veces no devuelve datos
Cuando ejecuta una consulta obtiene tres cosas:
- ellos llaves
- Los valores
- el orden relativo entre estos
Cuando convierte el resultado en un Map
sólo puede contener dos de éstos, por lo que la orden se pierde. Para evitar esto, debe utilizar el método DataSnapshot.getChildren()
:
Query query = locationComment.orderByKey(); query.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if (dataSnapshot.getValue() == null) { return; } data.clear(); for (DataSnapshot child : dataSnapshot.getChildren()) { ... } adapter.notifyDataSetChanged(); }
Consulte también este ejemplo en la documentación de Firebase sobre cómo trabajar con listas: https://firebase.google.com/docs/database/android/lists-of-data#listen_for_value_events
Parece que sus datos están mal estructurados.
Firebase tiene su forma interna de clave, y Firebase sólo puede ordenar esas claves, con criterios adicionales si se desea. Pero como su clave, es una clave personalizada, firebase no puede y no ordenará esta rama.
La solución es reestructurar sus datos de una manera significativa, como esto
+ comments + total: 13 + data: + 12uoasjihdou3 + time: xx + userID: xx + comment: xx + 123tjiueoi134 + 1piahf9hasheui + 6890324890oiuwer
Siempre use push () para generar nuevas claves, no cree claves personalizadas para las listas, eso es un total no ir
FirebaseDatabase.getReference("comments").child("data").push({yourdata});
si quieres ordenar tus datos, así es como lo haces
FirebaseDatabase.getReference("comments").child("data").orderByChild("time");
- Cómo rotar la imagen en particular entre varias imágenes dibujadas en lienzo en android?
- ¿Cómo utilizar contactos API para Android 1.x y 2.x simultáneamente?