services play auth android firebase firebase-database firebaseui

android - auth - firebaseui version firebase play services version



Filtrar elementos para rellenar en RecyclerView basado en una clave secundaria usando parseSnapshot(instantánea de DataSnapshot) (2)

Estoy desarrollando un tipo de aplicación de foro donde los usuarios pueden publicar preguntas y etiquetarlas con tecnologías relacionadas.

La aplicación tiene los módulos y la base de datos similar al repositorio de la base de datos de Firebase .

Quería filtrar las publicaciones de acuerdo con sus etiquetas. Como el filtrado en el lado del servidor no es posible para múltiples valores clave, tuve que acercarme a una forma de filtrarlo antes de rellenar RecyclerView.

Me referí a muchas preguntas aquí y encontré la respuesta de Puf relevante para este caso.

Este es mi árbol JSON

"posts" : { "-Kdb0BsybfpPtkAPRF1-" : { "author" : "Anush Surendran", "body" : "Test 1 ", "commentCount" : 0, "created" : 1487787053303, "starCount" : 1, "stars" : { "v9KTwyI2DMbDgKHALgPSJEBK3fi1" : true }, "tag" : "#CSS", "title" : "Checking Post Time", "uid" : "BvNgX2U5U4SriTWsoEtqbGYgOTw1" }, "-Kdb2D9vD-3kHWpCMIFi" : { "author" : "Anush Surendran", "body" : "Abc", "commentCount" : 0, "created" : 1485000000000, "starCount" : 0, "tag" : "#HTML", "title" : "Test 2", "uid" : "BvNgX2U5U4SriTWsoEtqbGYgOTw1" }

Estoy anulando parseSnapshot con la siguiente lógica

@Override protected Post parseSnapshot(DataSnapshot snapshot) { if (snapshot.getValue(Post.class).tag.equals("#HTML")){ Log.d(TAG,"gotHTML Filtered Posts"); return snapshot.getValue(Post.class); } else return super.parseSnapshot(snapshot); }

Probando con un solo valor ahora. Pondré esto en un bucle para filtrar varias etiquetas (por ejemplo, HTML, CSS, JS)

El código funciona bien y pude ver si la condición funciona como se esperaba.

No pude averiguar qué devolver en la parte else si no hay publicaciones con una etiqueta específica. La parte else actual devuelve todas las publicaciones.

¿Hay una mejor manera de filtrar datos en comparación con esto?

¡Cualquier ayuda sería muy apreciada!


Anulación de parseSnapshot se puede utilizar para asignar la vista a un subconjunto de los datos en la instantánea. Si no se puede usar para filtrar datos.

Actualmente no hay forma de filtrar datos en el cliente con FirebaseUI. Hay una solicitud de función abierta para ello: https://github.com/firebase/FirebaseUI-Android/issues/15 . Como puede ver en ese tema, es una característica polémica.

Como Morgan dice allí :

[FirebaseUI] tiene el filtrado como un objetivo deliberadamente no objetivo, ya que no queremos alentar con avidez los datos que nunca se muestren.

Definitivamente temería recuperar demasiados datos en tu escenario. Sería mucho mejor crear un modelo de datos que permita realizar el filtrado requerido en el servidor.


Puede obtener los datos filtrados de firebase en lugar de tomar todos los datos y filtrarlos en el cliente.

DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference(); Query postsQuery = mDatabase.child("posts").orderByChild("tag").equalTo("#HTML"); mAdapter = new FirebaseRecyclerAdapter<Post, PostViewHolder>(Post.class, R.layout.item_post, PostViewHolder.class, postsQuery) { @Override protected void populateViewHolder(final PostViewHolder viewHolder, final Post model, final int position) { final DatabaseReference yourRef = getRef(position); viewHolder.bindToPost(model,getContext()); } }; mRecycler.setAdapter(mAdapter);