java android firebase google-cloud-firestore

java - ¿Cómo omitir los datos iniciales y desencadenar solo nuevas actualizaciones en Firestore Firebase?



android google-cloud-firestore (2)

He buscado por todas partes sin suerte. Quiero consultar a Firestore para que todos los usuarios DONDE el tipo sea admin. Algo como:

SELECT * FROM users WHERE type=admin

pero solo cuando el total la propiedad esta cambiando. Si estoy usando:

users.whereEqualTo("type", "admin").addSnapshotListener(new EventListener<QuerySnapshot>() { @Override public void onEvent(@Nullable QuerySnapshot snapshots, @Nullable FirebaseFirestoreException e) { for (DocumentChange dc : snapshots.getDocumentChanges()) { switch (dc.getType()) { case ADDED: //Not trigger break; case MODIFIED: //Trigger break; case REMOVED: // break; } } } });

El caso AGREGADO se desencadena por primera vez cuando realizo una consulta y cuando se cambia el total se vuelve a activar MODIFIED (esto es lo que se quiere). Solo quiero cambios y no todos los datos iniciales, no los necesito. ¿Cómo conseguirlo?

Por favor ayúdame, es la última parte de mi proyecto. ¿Cómo omitir es el case ADDED ?


Aquí hay una solución que funciona para mí: usar

AtomicBoolean isFirstListener = new AtomicBoolean(true);

y luego en el método de evento

if (isFirstListener.get()) { isFirstListener.set(false); //TODO Handle the entire list. return; }

Aquí hay un código de ejemplo de mi proyecto:

final AtomicBoolean isFirstListener = new AtomicBoolean(true); mDb.collection("conversation_log").document(room_id).collection("messages").orderBy("sent_at") .addSnapshotListener(new EventListener<QuerySnapshot>() { @Override public void onEvent(@Nullable QuerySnapshot value2, @Nullable FirebaseFirestoreException e) { if (isFirstListener.get()) { isFirstListener.set(false); //TODO Handle the entire list. return; } } });

referencia: answer


Cuando está escuchando los cambios en Cloud Firestore para los cambios en tiempo real, utilizando el método addSnapshotListener() Firestore Query:

Comienza a escuchar esta consulta.

Lo que básicamente significa que la primera vez que adjunta el oyente, obtiene todos los documentos que corresponden a esa consulta en particular. Además, cada vez que una propiedad dentro de un documento cambia, se le notifica de acuerdo con ese cambio. Obviamente, esto sucede solo si el oyente permanece activo y no se elimina.

Desafortunadamente, los oyentes de Firestore no funcionan de esa manera, por lo que no puede omitir ese "caso AGREGADO". Lo que puede hacer en su lugar, es agregar, agregar a cada objeto de usuario una propiedad de Date ( this es como puede agregarla) y consultar su base de datos en el cliente, de acuerdo con esta nueva propiedad, para todos los documentos que han cambiado desde una vez anterior.

De acuerdo con el comentario de Nick Cardoso, para los futuros visitantes que puedan preguntar por qué ocurre este comportamiento, se debe a la razón que mencionó en su comentario. También recomiendo ver la respuesta de Doug Stevenson en este post , para una mejor comprensión.