Synchronisieren IOS-Kerndaten mit Web-Service?

8

Hier ist mein Problem:

  • Ich möchte Kerndaten verwenden - Geschwindigkeit und Konnektivität, um meine IOS-App zu erstellen. Die in den Core-Daten gespeicherten Daten stammen aus einer SQLServer-Datenbank, auf die ich über einen noch zu definierenden Web-Service zugreifen kann.
  • Alle Änderungen an den Daten, die in den Kerndaten gespeichert sind, müssen über einen Webservice mit dem SQL Server synchronisiert werden. Außerdem muss ich Änderungen puffern, die wegen Verbindungsproblemen nicht synchronisiert werden.
  • Ich muss auch die Kerndaten mit allen Änderungen aktualisieren, die auf dem Server aufgetreten sind. Dies könnte nach einem in den Benutzereinstellungen festgelegten Zeitplan geschehen.

Lösungen, die ich erforscht habe:

  • Verwenden von NSIncrementalStore class (neu in IOS 5). Ich bin sehr verwirrt darüber, was das genau macht, aber es klingt vielversprechend. Von dem, was ich sagen kann, Unterklasse NSIncrementalStore , die Ihnen ermöglicht, die regulären Kerndaten API-Aufrufe abzufangen. Ich könnte dann die Informationen an die Kerndaten weitergeben und sie über einen Webservice mit der externen Datenbank synchronisieren. Ich könnte völlig falsch liegen. Aber wenn ich richtig liege, wie würde ich Deltas synchronisieren, wenn die Verbindung zum Internet unterbrochen ist?
  • AFIncrementalStore - Dies ist eine Unterklasse von NSIncrementalStore , die AFNetworking verwendet, um das Web-Service-Stück zu erstellen.
  • RestKit - Ich bin ein wenig besorgt darüber, wie aktiv diese API ist und sie scheint einen Übergang zur Blockfunktionalität zu durchlaufen. Hat jemand das ausgiebig genutzt?

Ich lehne mich zu AFIncrementalStore hin, da dies (was zu sein scheint) ein Standardansatz ist. Das Problem ist, ich könnte komplett darauf verzichten, was NSIncrementalStore wirklich ist.

Ein Link zu einem Beispielcode oder Tutorial wäre großartig!

    
JustLearningAgain 14.08.2012, 21:48
quelle

2 Antworten

5

Meine Lösung bestand darin, zwei Kopien des Datensatzes in einer CoreData-Datenbank zu speichern. Einer repräsentiert den zuletzt bekannten Server-Status und ist unveränderbar. Der andere wird vom Benutzer bearbeitet.

Wenn es an der Zeit ist, Änderungen zu synchronisieren, erstellt die App einen Unterschied zwischen den bearbeiteten und unveränderlichen Kopien der Daten. Die App sendet das Diff an einen Webdienst, der das Diff auf seine eigene Kopie der Daten anwendet. Es antwortet mit einer vollständigen Kopie des Datensatzes, den die App auf beide Kopien der Daten überschreibt.

Die Vorteile sind:

  • Wenn keine Netzwerkverbindung besteht, gehen keine Änderungen verloren: Das diff wird jedes Mal berechnet, wenn der Datensatz gesendet werden muss, und die unveränderbare Kopie wird nur bei einer erfolgreichen Synchronisierung geändert.
  • Es wird nur die minimale Menge an Informationen gesendet, die gesendet werden müssen.
  • Mehrere Personen können dieselben Daten gleichzeitig bearbeiten, ohne Sperrstrategien zu verwenden, bei denen die Möglichkeit zum Datenverlust durch Überschreiben minimal ist.

Die Nachteile sind:

  • Das Schreiben des Diffing-Codes ist komplex.
  • Das Schreiben des Merging-Service ist komplex.
  • Wenn Sie kein Metaprogrammierungsguru sind, werden Sie feststellen, dass Ihr Vergleichs- / Zusammenführungscode spröde ist und sich ändern muss, wenn Sie Ihr Objektmodell ändern.

Hier sind einige der Überlegungen, die ich bei der Entwicklung der Strategie hatte:

  • Wenn Sie zulassen, dass Änderungen offline vorgenommen werden, funktioniert die Check-in / Checkout-Sperrung nicht (wie können Sie eine Sperre ohne Verbindung herstellen?).
  • Was passiert, wenn zwei Personen gleichzeitig dieselben Daten bearbeiten?
  • Was passiert, wenn eine Person Daten auf einem iOS-Gerät bearbeitet, wenn sie verbindungslos ist, sie ausschaltet, auf einem anderen Gerät bearbeitet und dann das ursprüngliche Gerät wieder einschaltet?
  • Multithreading mit CoreData ist eine ganze Problemklasse für sich.

Das nächste, was ich von der Out-of-the-Box-Unterstützung gehört habe, ist das neue iCloud / CoreData-Synchronisationssystem in iOS6, das automatisch Elemente aus einer CoreData-Datenbank nach iCloud überträgt, wenn sie sich ändern . Das bedeutet jedoch, dass Sie iCloud verwenden müssen.

EDIT: Das ist sehr spät, ich weiß, aber hier ist eine Klasse, die in der Lage ist, einen Unterschied zwischen zwei NSManagedObject-Instanzen zu erzeugen.

%Vor%

Es gibt mehr Informationen darüber, was es macht, wie es es macht und seine Einschränkungen / Annahmen hier:

Ссылка

    
Ant 14.08.2012, 22:01
quelle
0

Verwenden Sie die Parse-Plattform und ihr IOS-SDK, um Informationen zu strukturieren und zu speichern. Es kann Daten lokal zwischenspeichern, so dass Sie es schnell abrufen können, wenn keine Verbindung besteht.

    
Ben Wheeler 27.08.2013 22:29
quelle

Tags und Links