La spécification SyncML peut être utile, mais elle est assez difficile à lire et, évidemment, biaisée vers SyncML.
J'ai dû mettre en œuvre pour cette Task Coach, alors voici quelques idées:
Un drapeau de modification est suffisant, un horodatage ne fournit pas vraiment beaucoup plus d'informations. En règle générale, mes objets sont dans un de ces états:
- Aucun
- Nouveau
- Deleted
- Modified
Les transitions suivantes se produisent lorsque l'objet est modifié:
- Aucun -> Modifié
- Nouveau -> Nouveau
- supprimé -> (ne devrait pas arriver)
- Modifié -> Modifié
et les suivantes quand il est supprimé:
- Aucun -> supprimé
- Nouveau -> Effacement réel (il peut être retiré du stockage)
- Supprimé -> (ne devrait pas se produire)
- Modifié -> Supprimé
Lors de la synchronisation, l'appareil envoie d'abord au poste de travail tous les objets dont l'état est différent de Aucun. Le bureau demande à l'utilisateur de résoudre les conflits si l'un de ceux-ci a un statut! = None de son côté. Dans tous les cas, l'objet entre dans l'état Aucun sur le périphérique ou est supprimé du stockage si son état a été supprimé.
Ensuite, le bureau envoie ses propres modifications à l'appareil. Il n'y a pas de conflit possible puisque tous les objets sont dans l'état Aucun sur le périphérique. Les objets sur le bureau passent à l'état Aucun ou sont également supprimés du stockage, et la synchronisation est terminée.
Il existe deux types de conflits possibles, en fonction des états périphérique/de bureau:
- modifié/supprimé. Si l'utilisateur choisit de faire confiance à l'appareil, l'objet de bureau est remplacé par celui de l'appareil; Sinon, le bureau ne fait rien et conserve l'état supprimé, de sorte que l'objet sera retiré de l'appareil dans la phase 2.
- supprimé/Si l'appareil gagne, l'objet est réellement supprimé du bureau. Sinon, l'objet passe à l'état Nouveau sur le bureau afin qu'il soit restauré sur l'appareil en phase 2.
- supprimé/supprimé: Duh. Retirez-le du stockage. Modifié/modifié: L'utilisateur décide quelles valeurs conserver, peut-être sur une base champ par champ. L'état reste sur Modifié sur le poste de travail afin que ces choix soient renvoyés au périphérique en phase 2.
Certains conflits peuvent être évités si l'état Modifié est conservé pour chaque champ, par exemple un objet avec un objet modifié sur l'appareil et un résumé modifié sur le bureau ne déclencheront pas de conflit. Vous pouvez jeter un oeil au code de Task Coach pour un exemple (référentiel SVN sur SourceForge, il a à la fois l'application de bureau en Python et l'application iPhone). En fait, dans ce cas, j'ai décidé d'utiliser une approche plus simple; Je ne garde pas trace de l'état sur le bureau. Après la phase 1 (périphérique à bureau), je viens de faire un remplacement complet des objets sur l'appareil avec ceux sur le bureau. Ainsi, il n'y a pas de conflit (l'appareil gagne toujours).
Évidemment, cela fonctionne seulement entre deux dispositifs fixes; Si vous voulez synchroniser avec plusieurs téléphones/applications de bureau, vous devez attribuer un identifiant unique à chacun et garder différents états pour différents appareils/applications. Cela peut commencer à devenir poilu.
HTH
L'horodatage aide à distinguer les modifications simultanées sur deux périphériques. Si vous utilisez simplement un indicateur booléen 'modified', il est difficile de savoir quelles sont les données les plus récentes. – AlBlue
Merci fraca7, c'était juste le genre de chose que je suis après. Je vais aussi regarder dans les docs SyncML pour voir s'ils vont dans ce genre de détail. D'autres suggestions quelqu'un? –
AlBlue: c'est si vous voulez une sorte de résolution automatique des conflits, mais je préfère demander à l'utilisateur. Si les deux enregistrements ont été modifiés, il devrait être celui qui décide. – fraca7