web-dev-qa-db-fra.com

Incrémenter automatiquement une valeur dans Firebase

Comment incrémenter automatiquement une valeur stockée dans Firebase à partir d'un client Android?

Actuellement: je déclare int id = 1. Lorsque j'incrémente, je vois les valeurs 2, 3 etc. enregistrées. C'est bien, mais lorsque je réexécute le projet, id est de nouveau égal à 1.

Je veux qu'il se comporte comme une variable statique, donc je peux créer un identifiant qui passera de 1 à l'infini sans réinitialisation.

ÉCHEC MIS À JOUR

J'ai utilisé ce qui suit pour transmettre la référence Firebase et une chaîne à la fonction incrementCounter.

if(language_chosen.equalsIgnoreCase("english"))
 {
   Firebase publRef = f.child("Language").child("English").child("Message");
   Firebase newPublRef = publRef.Push();
   writeMsgActivity demo = new writeMsgActivity();
   demo.incrementCounter(newPublRef,the_msg_enter);                                 
  }

Maintenant, j'essaie d'utiliser la référence et la chaîne passées à public void incrementCounter(Firebase publref,String my_msg) dans la méthode oncomplete mais cela me donne une erreur.

   public void incrementCounter(Firebase publref,String my_msg) {
    publref.runTransaction(new Transaction.Handler() {
        @Override
        public Transaction.Result doTransaction(final MutableData currentData) {
            if (currentData.getValue() == null) {
                currentData.setValue(1);
            } else {
                currentData.setValue((Long) currentData.getValue() + 1);
            }

            return Transaction.success(currentData);
        }

        public void onComplete(FirebaseError firebaseError, boolean committed, DataSnapshot currentData) {
            if (firebaseError != null) {
                System.out.println("Firebase counter increment failed.");
            } else {
                System.out.println("Firebase counter increment succeeded.");

                Map<String, Object> publ = new HashMap<String, Object>();
                publ.put("pubMsg", my_msg);
                publ.put("id",currentData);
                publref.setValue(publ);
            }
        }
    });
}

MIS À JOUR RÉSOL

                final Firebase upvoteref = new Firebase("https://shareurday.firebaseio.com/Message/"+msg_id+"/upvotes"); 

            upvoteref.runTransaction(new Transaction.Handler() {
                @Override
                public Transaction.Result doTransaction(final MutableData currentData) {
                    if (currentData.getValue() == null) {
                        currentData.setValue(1);
                    } else {
                        currentData.setValue((Long) currentData.getValue() + 1);
                    }
                    return Transaction.success(currentData);
                }

                public void onComplete(FirebaseError firebaseError, boolean committed, DataSnapshot currentData) {
                    if (firebaseError != null) {
                        System.out.println("Firebase counter increment failed.");
                    } else {
                        System.out.println("Firebase counter increment succeeded.");
                    }
                }
            });

La variable msg_id est l'id généré de manière aléatoire par Push.

12
nothingness

Voici un exemple de méthode qui incrémente un seul compteur. L'idée clé est que vous créez soit l'entrée (la définissant égale à 1), soit en mutant l'entrée existante. L'utilisation d'une transaction ici garantit que si plusieurs clients tentent d'incrémenter le compteur en même temps, toutes les demandes aboutiront finalement. À partir de la documentation Firebase (soulignement le mien):

Utilisez notre fonctionnalité de transactions lorsque vous travaillez avec des données complexes qui pourraient être corrompus par des mises à jour simultanées

public void incrementCounter() {
    firebase.runTransaction(new Transaction.Handler() {
        @Override
        public Transaction.Result doTransaction(final MutableData currentData) {
            if (currentData.getValue() == null) {
                currentData.setValue(1);
            } else {
                currentData.setValue((Long) currentData.getValue() + 1);
            }

            return Transaction.success(currentData);
        }

        @Override
        public void onComplete(FirebaseError firebaseError, boolean committed, DataSnapshot currentData) {
            if (firebaseError != null) {
                Log.d("Firebase counter increment failed.");
            } else {
                Log.d("Firebase counter increment succeeded.");
            }
        }
    });
}
16
stkent

Une nouvelle fonctionnalité est ajoutée au firestore pour les valeurs d'auto incrémentation. Aussi simple que

document("fitness_teams/Team_1").
  updateData(["step_counter" : FieldValue.increment(500)])

lien de référence: https://firebase.googleblog.com/2019/03/increment-server-side-cloud-firestore.html

Utilisé ci-dessous le code dans mon projet.

var firestore = Firestore.instance;
firestore.collection('student').document('attendance').updateData({'total_attendace': FieldValue.increment(1)});
0
AtulK