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)

Instantánea de datos

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!

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"); 
  • Error: Error de ejecución de la tarea ': app: packageDebug'. >! Zip.isFile ()
  • ¿Cómo guardar las coordenadas de GeoFire junto con otros elementos en la base de datos de Firebase?
  • Notificaciones duplicadas de mensajería en la nube de Firebase
  • Filtra los datos en firebase con SearchView
  • ¿Cómo enviar confirmación de correo electrónico de Firebase en la suscripción?
  • Los eventos de Android Firebase Analytics no se muestran en la consola
  • Firebase Cloud Messaging reemplazó las claves del servidor con Tokens para enviar notificaciones / mensajes
  • Firebase se bloquea en Android durante el inicio de sesión anónimo
  • No se puede ver la opción de nube en Servicios para desarrolladores de Android Studio 2.2
  • ¿Qué es '<OR>' en la pila de choque de firebase?
  • Actualización de base de datos de Firebase desde el servicio en segundo plano
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.