2010-09-28 5 views
2

Mon application analyse XML à partir du serveur distant et stocke les objets dans les données de base (stockage SQLite). Ainsi, l'utilisateur peut parcourir le document lorsqu'il est HORS LIGNE en lisant depuis le stockage local.Synchronisation de données de base iOS avec un serveur distant qui envoie du code XML

L'utilisateur peut modifier des objets lors de la navigation hors-ligne qui est stockée localement en magasin Core Data SQLite. Un autre utilisateur apporte des modifications à l'objet sur le serveur distant et il y est stocké. Maintenant, lorsque je détecte une connexion Internet, mon application doit synchroniser mon stockage local avec le serveur distant. Ce qui signifie que le serveur distant est mis à jour avec les modifications que j'ai apportées à mes Core Data (stockage SQLite) lorsque j'étais hors ligne et que mon stockage local - Core Data (stockage SQLite) doit être mis à jour.

Par exemple il y a un forum et il est stocké dans mon stockage local afin que je puisse lire et répondre quand je suis en voyage. Quand plus tard sur internet est accessible. Mon application doit automatiquement mettre toutes mes réponses stockées dans les données de base vers le serveur distant et également apporter d'autres messages sur le serveur distant dans mon stockage local.

serveur distant envoie XML que je suis l'analyse et le stockage dans CoreData. Mon problème est de savoir comment le synchroniser? Comment les deux moyens de communication se produit-il quand il y a un changement? Comment synchroniser uniquement les données qui ont été modifiées et non IMPORTER la totalité du DB du serveur distant et vice-versa?

Répondre

0

Une solution pourrait être

  • iphone permet de synchroniser les modifications sur le serveur
  • serveur
  • fusionne les anciens et nouveaux trucs
  • iPhone obtient les nouveaux changements (de la fusion) à partir du serveur

Alors le serveur soit le maître qui doit savoir comment fusionner des choses et les clients ne devraient télécharger les données progressivement après quelques modifications.

+0

Merci Kiran et brutella. Essayer de l'implémenter et de voir comment cela fonctionne. – Ravi

2

Je sais que l'une des façons de le faire ..

  1. ajouter un champ à votre base de données locale et le serveur. c'est-à-dire l'horodatage.
  2. Lorsque l'utilisateur modifie les données de la base de données locale, remplacez l'horodatage par l'heure actuelle. faites de même sur le serveur ..i.e. Lorsque quelqu'un édite des données sur le serveur, changez l'horodatage à l'heure actuelle.
  3. Lorsque l'utilisateur se connecte à Internet ... vérifiez l'horodatage local du timestamp au serveur. case 1 Les deux sont identiques - Rien à faire case 2 heure locale> heure du serveur - utilisez sql pour obtenir toutes les données dont l'horodatage est supérieur au serveur horodatage .. et le télécharger sur le serveur ... cas 3 serveur < locale .... obtenir tous les dossiers plus que l'horodatage local et l'ajouter à la base de données locale ..

Je ne suis pas sûr s'il y a une meilleure façon ... mais cela fonctionne sûrement ...

0

Transactions. Vous voulez suivre les règles ACID pour les transactions. Essentiellement, vous devez vous assurer que les données n'ont pas été mises à jour que vous n'avez pas actualisé localement avant de modifier votre écriture locale pour mettre à jour.

Ainsi, la façon la plus simple est d'avoir un utilisateur à obtenir la mise à jour la plus récente du serveur, puis l'écraser et assurez-vous que, avec horodatages aucune mise à jour se produit pendant othe ce processus.Mieux encore, utilisez le blocage avec des threads pour vous assurer que rien d'autre ne se passe.

Si vous effectuez des transactions Google ou ACID il y aura beaucoup d'informations là-bas. C'est un domaine important dans les environnements de SGBDR où de nombreux utilisateurs peuvent corrompre les données et les verrous doivent être maintenus entre les écritures et les mises à jour.

Questions connexes