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.