Llenar Androidx RecyclerView con CardView con los datos de dos colecciones de Firebase Firestore

Narlo:

Tengo 2 colecciones diferentes en la nube Firestore:

  • cuentas (identificador: userId)
    • nombre de usuario
    • pictureURL
  • mensajes (identificador: id)
    • ID de usuario
    • texto
    • gustos

Objetivo: Quiero tener estas dos colecciones de fragmentos con un Androidx RecyclerView para mostrar los mensajes con el nombre de usuario y pictureURL.

Solía " androidx.recyclerview: recyclerview: 1.1.0 " en mi build.gradle.

Yo uso el método siguiente para obtener los Mensajes de Firebase y almacenarlos en el modelo " FirebasePost ":

/**
     * Get all FirebasePost objects from Firebase Firestore collection
     * @return
     */
    public FirestoreRecyclerOptions<FirebasePost> getPosts() {
        Query mQuery = mFirestore.collection("posts").orderBy("createdAt", Query.Direction.DESCENDING);
        // Get the response elements
        FirestoreRecyclerOptions<FirebasePost> response = new FirestoreRecyclerOptions.Builder<FirebasePost>()
                .setQuery(mQuery, FirebasePost.class)
                .build();
        return response;
    }

Me pueblan el RecyclerView por el siguiente código:

/**
     * Prepares the Recycler View for showing the Posts data
     * @param mView Gets the current view
     */
    private void prepareRecyclerView(View mView, FirestoreRecyclerOptions<FirebasePost> response) {
        adapter = new FirestoreRecyclerAdapter<FirebasePost, PostHolder>(response) {
            @Override
            public void onBindViewHolder(@NonNull PostHolder holder, int position, @NonNull FirebasePost model) {
                // Bind the FirebasePost object to the PostHolder
                holder.setPostText_to_UI(model.getText());
                holder.setTimestamp_to_UI(model.getCreatedAt());
                holder.setAuthorDisplayName_to_UI(model.getAuthorUserId());
            }

            @NonNull
            @Override
            public PostHolder onCreateViewHolder(@NonNull ViewGroup group, int i) {
                // Create a new instance of the ViewHolder, in this case we are using a custom
                // layout called R.layout.message for each item
                View view = LayoutInflater.from(group.getContext())
                        .inflate(R.layout.posts_item_cardview, group, false);

                return new PostHolder(view);
            }
        };
        mPostsRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        mPostsRecyclerView.setItemAnimator(new DefaultItemAnimator());
        mPostsRecyclerView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }

¿Cómo puedo aplicar una segunda solicitud a Firebase para obtener la información de usuario y añadir estos en los lugares adecuados del RecyclerView? El problema es que tengo la AuthorUserId pero no el idioma del usuario, porque no puedo realizar otra petición a Firestore, antes de dar el modelo al RecyclerView.

Alex Mamo :

Quiero tener estas dos colecciones en un fragmento con AndroidX RecyclerViewpara mostrar los mensajes con el nombre de usuario y pictureURL.

Consultas en Firestore son poco profundas, lo que significa que sólo se puede obtener artículos de la colección que la consulta se ejecuta en contra. No hay manera de conseguir documentos de diferentes colecciones en una sola consulta. En el mundo NoSQL, no existe el concepto de INNER JOINla base de un identificador que existe dentro de las dos tablas. Firestore no admite consultas a través de diferentes colecciones de una sola vez, a menos que esté utilizando consultas de grupos colección FireStore , pero no es el caso. Una sola consulta sólo podrá utilizar las propiedades de los documentos en una sola colección.

La solución más simple que puedo pensar sería la de almacenar en cada puesto, los datos del usuario (nombre de usuario y pictureURL). Esta práctica se llama desnormalización y es una práctica común cuando se trata de Firebase. Si usted es nuevo en las bases de datos NoSQL, te recomiendo que veas el vídeo, Desnormalización es normal con la base de datos Firebase para una mejor comprensión. Es por Firebase en tiempo real de base de datos, pero las mismas reglas se aplican a la nube Firestore.

Para obtener más información recomiendo leer también mi respuesta desde el siguiente mensaje:

Editar:

Cuando se está duplicando los datos, hay una cosa que hay que tener en cuenta. De la misma manera, va a agregar datos, es necesario para mantenerla. En otras palabras, si quiere actualizar / borrar un elemento, que tiene que hacer en cada lugar que existe. Se trata de cómo funciona esta técnica.

Quiero evitar iterar sobre todos (tal vez millones de) los mensajes y borrar los datos de usuario duplicados allí.

Para pesadas actualizaciones / eliminaciones en su base de datos, cada vez que es una solución de compromiso, pero siempre depende de su caso de uso y requisitos exactos. Otra solución podría ser para consultar la base de datos dos veces, una vez para obtener los puestos y justo después de eso, los correspondientes datos de usuario. Esta técnica no es tan lento como se podría pensar. Por lo que debe tener en cuenta que, como una opción también.

Otra solución que también se debe considerar es aumentar sus datos para aceptar una búsqueda inversa. Dicho esto, se puede añadir en cada objeto de usuario, el puesto de trabajo correspondiente en una subcolección. Si necesita consultar todos los mensajes de todos los usuarios, entonces se requerirá una consulta grupo de colección.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=345858&siteId=1
Recomendado
Clasificación