0
votes

Comment puis-je appeler une notification uniquement lorsque la base de données Firebase a changé?

comme titre ce que je veux faire, c'est que lorsque la base de données avait changé que la notification d'exécution, mais un problème est lorsque je exécute une application, la notification apparaît même que les données ne sont pas modifiées. Voici mon code:

 public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v= inflater.inflate(R.layout.main,container,false);

        result= (TextView) v.findViewById(R.id.textView3);


        notificationmanager = NotificationManagerCompat.from(ct.getcontext());
        if (user != null) {

            ref.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    if (dataSnapshot.exists()) {
                        String post = dataSnapshot.getValue(String.class);
                        result.setText(post);

                        Notification notification = new NotificationCompat.Builder(ct.getcontext(), CHANNEL_1_ID)
                                .setSmallIcon(R.drawable.ic_launcher_foreground)
                                .setContentTitle(post)
                                .setContentText("test")
                                .setPriority(NotificationCompat.PRIORITY_HIGH)
                                .setCategory(NotificationCompat.CATEGORY_EVENT)
                                .setDefaults(Notification.DEFAULT_ALL)
                                .build();
                        notificationmanager.notify(2,notification);



                    }

                }

                @Override
                public void onCancelled(DatabaseError error) {

                }
            });

        }
        else
        {
            Toast.makeText(getActivity(),"not yet login",Toast.LENGTH_LONG).show();
        }


        return v;
    }


3 commentaires

Mes excuses que j'ai supprimées


Le premier appel à Firebase fonctionne également comme Ondatachange pour cela. Vous pouvez modifier votre appel en Firebase en AddchildeventListener et vous obtiendrez plus de rappels comme Onchildchanged . Notez que vous devez modifier votre référence.


Cet auditeur vous donnera une seule fois que la valeur de la valeur dans la référence que vous avez utilisée. Indépendamment de savoir si une valeur avait changé


3 Réponses :


0
votes

Vous devez utiliser addvevalueeeventlistener () , à partir des docs:

Public valuantEventListener AddValueEventListener (ValueEventEventListener Sociéter)

Ajouter un auditeur pour les modifications apportées aux données à cet endroit. À chaque fois que les données changent, votre auditeur sera appelé avec un instantané immuable des données.

Utilisation de addvelueeeventListener , chaque fois que la base de données est modifiée, elle sera déclenchée.


1 commentaires

Un auditeur tirera toujours avec la valeur actuelle aussi, SO OP devra filtrer cela, par exemple en le suivant dans les préférences locales telles que répondit à Vicky < / a>.



1
votes

Enregistrez la valeur dans vos préférences locales, puis sur la prochaine modification, vérifiez si la valeur si elle est vraiment modifiée en comparant la valeur précédemment enregistrée.


0 commentaires

0
votes

de l'explication de @ Mikasaloli, je soupçonne que le problème se situe plus dans un mélange de la manière dont Firebase RTDB (base de données en temps réel) / Fonctions Firestore et le mauvais auditeur.

Le premier problème est que Firebase RTDB / Firestore par défaut conserve une copie de cache locale des références (pas toutes) que vous avez accessibles sur votre téléphone. De leurs docs, Ils disent , et je cite: "Soutiteurs asynchrones: les données stockées dans une base de données Realtime Firebase sont récupérées en attachant un auditeur asynchrone à une référence de base de données. L'auditeur est déclenché une fois pour l'état initial des données et à tout moment les données changent de données. Un auditeur d'événements peut recevoir plusieurs < Un href = "https://firebase.google.com/docs/database/admin/retrieve-DataA#Section-Event-TataAnsection-Event-types" rel = "NOfollow NOREFERRER"> Types d'événements . Ce mode de récupération de données est pris en charge dans Java, Node.Js et Python Admin SDKS. " Ce que vous devez faire est de contourner le cache local lors de la lecture de données pour la première fois après le démarrage de l'application. Voici comment j'ai été capable de Faites-le (avec un peu de peaux de peau)

Le deuxième problème est tel que mentionné précédemment par les autres, addlistenerforforforforforforforsinglevalueEEEVER ne sera déclenchée qu'une seule fois. Ainsi, en supposant que vous receviez le changement de notification pour la première fois, votre auditeur vous désintègre automatiquement impliquant que vous ne recevrez pas les événements ultérieurs surDatachange.

Maintenant, conjecture des paragraphes précédents, le problème avec le code ci-dessus est: Il attache un auditeur pour un événement de valeur unique. qui est alors déclenché avec la version locale (mise en cache) des données qui n'est la force de la base de la base de données du serveur (si l'application était hors ligne alors que certaines modifications ont eu lieu en ligne). Mais ensuite, lors de l'attachement à cet auditeur, il est déclenché avec la version locale des données et des non-clients elles-mêmes. Impliquant, le code ci-dessus sera déclenché une fois au plus et pourrait ne jamais être déclenché pendant sa vie tout en étant attaché.

Ce que je suggère, est-ce que vous contournez le cache local et utilisez un addvvalueeeventListener.


0 commentaires