Cómo ordenar los registros de Firebase por dos campos (Android)

Estoy usando FirebaseRecyclerAdapter y paso FirebaseRecyclerOptions con alguna consulta en el constructor. Cada elemento tiene una cantidad de campos que incluyen la marca de tiempo a y otro campo entero b . Por lo tanto, quiero que los elementos con a más antiguo pero menos b estén en la parte superior de la lista. Es fácil de implementar con sqlite, pero no tan fácil con nosql. Parece que necesito agregar un campo adicional que mantenga ambos campos: String.valueOf(a) + String.valueOf(b) pero ¿cómo lograr las propiedades asc / desc?

Cargar toda la lista y ordenar en Java no es una opción.

Lamentablemente, la base de datos de Firebase Realtime no admite consultas en varias propiedades, solo admite consultas en una sola propiedad secundaria. Entonces, tienes razón en adivinar que necesitarás crear un campo extra para mantener ambos campos. Entonces, para lograr esto, necesita crear un nuevo campo que en su base de datos debería verse así:

 Firebase-root | --- itemId | --- a: valueOfA | --- b: valueOfB | --- a_b: valueOfA_valueOfB 

Como puede ver, la propiedad a_b combina los valores que desea filtrar.

A diferencia de la base de datos Firebase Realtime, Cloud Firestre permite consultas compuestas . Deberías echarle un vistazo a esto. Por lo tanto, una consulta como la siguiente está permitida en Cloud Firestre sin crear una propiedad combinada.

 itemIdRef.whereEqualTo("a", "valueOfA").whereEqualTo("b", "valueOfB"); 

Cuando ordena cadenas, este es el método normal de ordenamiento. Una solución rápida sería agregar dos ceros antes de cada segundo elemento como este: "1516428687_001" , "1516428687_002" , "1516428687_012" . Ahora su orden estará bien. Para obtener más explicaciones, vea mi respuesta de esta publicación .