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.
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.");
}
}
});
}
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)});