Firebase + Android – Notificaciones ChildAdded – ¿Cómo obtener sólo New Childs?
Estoy tratando de configurar un servicio de Android en mi aplicación que escucha a los nuevos Childs en un Firebase Ref, y lanza una notificación cuando eso suceda.
Estoy teniendo problemas porque addChildEventListener onChildAdded
aparentemente se llama una vez para cada registro existente y sólo entonces realmente escucha para los nuevos childs ..
- Donde poner la función Firebase.setAndroidContext ()
- ¿Qué es la versión mínima de Google Play Services para utilizar Firebase?
- Android Studio - No se puede resolver el símbolo 'firebase'
- "FirebaseError: Se proporcionan credenciales de autenticación no válidas" al configurar el inicio de sesión de Google en Android
- Seguridad de Firebase
En esta respuesta @kato afirma que si addChildEventListener
se llama como ref.endAt().limit(1).addChildEventListener(...)
obtendría sólo los registros recién agregados.
En realidad, sólo obtiene un registro a la vez (supongo que con limit(1)
), pero todavía obtiene un registro existente antes de escuchar los registros añadidos.
He aquí un código:
Inicializando el Listener en onCreate ():
@Override public void onCreate() { super.onCreate(); this.handler = new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String s) { AllowedGroup ag = dataSnapshot.getValue(AllowedGroup.class); postNotif("Group Added!", ag.getName()); } ...rest of needed overrides, not used...
Estoy usando la AllowedGroup.class
para almacenar los registros y postNotif
para crear y publicar la notificación. Esta parte está funcionando según lo previsto.
Entonces, onStartCommand()
:
@Override public int onStartCommand(Intent intent, int flags, int startId) { this.f = new Firebase(FIREBASE_URL).child("users").child(this.currentUserUid).child("allowedGroups"); f.endAt().limit(1).addChildEventListener(handler); return START_STICKY; }
Todavía devuelve un registro existente antes de escuchar realmente a los niños recién agregados.
También he intentado consultar por timestamp, así:
@Override public int onStartCommand(Intent intent, int flags, int startId) { this.f = new Firebase(FIREBASE_URL).child("users").child(this.currentUserUid).child("allowedGroups"); f.startAt(System.currentTimeMillis()).addChildEventListener(handler); return START_STICKY; }
Esperando que sólo obtendría los registros establecidos después de que el servicio se inició. No obtiene registros existentes, pero ni siquiera recibe niños recién agregados .
EDITAR:
También he pensado en algo como poner en la memoria primero todos los registros existentes, y condicionalmente publicar una notificación si el registro traído por onChildAdded
no existe en la lista previamente reunida, pero eso parece un poco como exceso, y pensé que podría Ser una manera más fácil (más API-friendly) de hacer esto, ¿estoy bien?
¿Puede alguien darme alguna información sobre esto? Realmente no puedo encontrar nada en los documentos oficiales o en cualquier pregunta o tutorial de StackOverflow.
Gracias.
- ¿Por qué necesitamos aplicar plugin google-services en el fondo para Firebase SDK?
- Android NoClassDefFoundError: com.google.firebase.FirebaseOptions
- Cambiar dinámicamente el límite de una referencia de consulta de Firebase en Android
- Implementar Firebase dentro de una biblioteca
- Error al instalar apk en Android Studio 2.3
- Firebase Cloud Messaging no llama a FirebaseInstanceId
- Cómo mantener la escucha de servlets de App Engine en Firebase
- Error de generación de token Google Cloud Messaging (GCM) después de la actualización de Google Play Services relacionada con Firebase
Si tiene un campo modifiedOn
, puede indexarlo y configurar una consulta como:
Query byModified = firebaseEndpoint.orderByChild("modifiedOn").startAt(lastInAppTime);
Para mí la lógica era tener un valor – "status" por ejemplo- que necesita ser validado antes de decidir si es realmente nuevo o era un registro antiguo, entonces establezco el "status" a un valor diferente, así que no lo recibo La próxima vez:
@Override public void onChildAdded(DataSnapshot dataSnapshot, String previousChildKey) { if(dataSnapshot.hasChildren()) { String Id = (String) dataSnapshot.child("user_id").getValue(); String status = (String) dataSnapshot.child("status").getValue(); if (Id != null && Id.equals(storedId) && status != null && status.equals("created")) { Log.d("INCOMING_REQUEST", "This is for you!"); sessionsRef.child(dataSnapshot.getKey()).child("status").setValue("received"); } } }
- Hardware acelerado FFmpeg en android?
- RegisterMediaButtonEventReceiver / manejo de botones de volumen tema