La transaction Firebase lit null sur le chemin même s'il y a des données sur ce chemin

Dec 22 2020

Je comprends que les transactions Firebase lisent parfois les données comme nulles, mais la boucle s'exécute à nouveau jusqu'à ce que la valeur soit obtenue du serveur et validée. Cependant, je suis confronté à une situation unique où la transaction lit des données nulles et valide la valeur que je retourne en cas de null. Veuillez consulter le code ci-joint.

 deductTransaction.transaction((current_value) => {
       if (current_value != null) {
           return current_value - cost;
       }
       return 25;
   });

Dans le code ci-dessus "deductTransaction" se trouve le chemin des données (nombre) que je souhaite mettre à jour

Le code ci-dessus fonctionne bien dans certains cas, c'est-à-dire que la boucle s'exécute à nouveau au cas où null est lu et parfois il ne s'exécute qu'une seule fois, lit la valeur comme null même s'il y avait des données sur ce chemin, puis commet 25 détruisant ainsi les données d'origine

PS: Je suis sur le point de m'arracher les cheveux, donc toute aide serait très appréciée

Réponses

1 FrankvanPuffelen Dec 22 2020 at 20:48

Lorsque vous exécutez une transaction à un emplacement, le rappel / gestionnaire est immédiatement appelé avec l'estimation actuelle par le client de la valeur à cet emplacement. Le plus souvent, cette estimation initiale de la valeur actuelle sera null.

Votre gestionnaire doit gérer cette situation. Donc: disons qu'aucune donnée n'existe à l'emplacement et que vous souhaitez déduire le coût, que se passerait-il? En règle générale, vous revenez -25ou vous dites à la transaction d'abandonner.

Dans les deux cas: l'estimation initiale et la nouvelle valeur seront envoyées au serveur de base de données, qui détecte alors que la supposition initiale était erronée, et renverra la valeur actuelle à l'appelant. Le SDK appelle ensuite à nouveau votre gestionnaire / rappel, avec la meilleure estimation (non, espérons-le, correcte) de la valeur actuelle.

Regarde aussi:

  • Le gestionnaire de transactions de base de données en temps réel Firebase est appelé deux fois la plupart du temps (avec un diagramme du flux ci-dessus)
  • Firebase runTransaction ne fonctionne pas - MutableData est nul
  • Comprendre la résolution des conflits dans Firebase
  • Pourquoi les données actuelles de ma transaction Firebase sont-elles toujours nulles?

Remarque: vous pouvez désormais effectuer des opérations d'incrémentation et de décrémentation sans transaction en utilisant l' incrementopérateur. Cela simplifiera considérablement votre code et fonctionnera mieux, comme indiqué dans À quelle vitesse pouvez-vous incrémenter de manière atomique une valeur sur la base de données Firebase Realtime? .

À titre de comparaison: l' incrementopérateur suppose une valeur actuelle de 0si aucune valeur n'existe à l'emplacement.