6 votes

Firebase - Deux appareils hors ligne modifiant les mêmes données et l'ordre des modifications

J'ai une application Android qui permet de suivre certains articles et leurs quantités.

Ce dont j'ai besoin, c'est d'un moyen pour l'utilisateur de modifier les données sur plusieurs appareils tout en étant hors ligne, avec un ordre de synchronisation approprié.

Je ne sais pas comment l'expliquer au mieux, je vais donc donner un exemple :

  1. Le dispositif A modifie la quantité de l'article et la porte à 5.
  2. Le dispositif B passe à 3.
  3. Le dispositif B est mis en ligne et modifie les données sur le serveur, comme il se doit, en 3.
  4. L'appareil A est mis en ligne et remplace ces données par 5, ce qui est une modification plus ancienne et ne devrait pas être fait.

Cette situation peut-elle être évitée de manière native dans Firebase, ou dois-je, par exemple, utiliser des horodatages sur les éléments moi-même, et ne les remplacer que s'ils sont plus récents ?

Merci.

5voto

user3662061 Points 46

L'ajout d'un champ d'horodatage à chaque élément de la base de données et l'écriture d'une règle de sécurité dans firebase semblent fonctionner.
Il faut tenir compte du fait que, hors ligne, le seul horodatage que je peux obtenir provient de l'appareil, et non du serveur, ce qui peut parfois entraîner l'écrasement de données que nous ne souhaitons pas. Mais cela fonctionne suffisamment bien pour ce projet.
Vous trouverez ci-dessous la règle de base de données nécessaire pour vérifier ces horodatages :

"$name" : {
         ".write": "!data.exists() || (newData.child('timestamp').isNumber() && data.child('timestamp').val() <= newData.child('timestamp').val())"
      }

Il est indiqué : "vous pouvez écrire s'il n'y a pas de données ou si les données stockées ont un horodatage plus ancien que la nouvelle demande".
Il est important de se rappeler que les nœuds parents écrasent les règles des nœuds enfants. Cela signifie que toute authentification d'écriture doit être effectuée à ce niveau également.

3voto

ked Points 273

Vous pouvez utiliser l'horodatage de l'appareil pour conserver les données les plus récentes et rejeter toute modification de données effectuée auparavant... par exemple : si vos données sont structurées comme suit

{
    'users': {
        'userId': {
            'timestamp': 1496341800000,
            'var1': 'abc',
            'var2': 'abc'
        }
    }
}

à chaque mise à jour de l'objet pour n'importe quelle valeur, mettre également à jour l'horodatage, et ajouter la règle suivante dans la console firebase

{
"rules": {
    ".read": "auth != null",
    ".write": "auth != null",
    "users": {
        "$uid": {
            ".write": "$uid === auth.uid",
            ".validate": "!data.exists() || data.child('timestamp').val() <= newData.child('timestamp').val()"
        }
    }
}
}

lorsque plusieurs appareils sont mis en ligne et mettent à jour la base de données firebase, les données dont l'horodatage est le plus récent sont mises à jour.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X