Ich habe an einer Methode gearbeitet, um in einer iPhone-Anwendung gespeicherte Kerndaten zwischen mehreren Geräten wie einem iPad oder einem Mac zu synchronisieren. Es gibt nicht viele (wenn überhaupt) Synchronisierungsframeworks für die Verwendung mit Core Data unter iOS. Ich habe jedoch über das folgende Konzept nachgedacht:
- Der lokale Kerndatenspeicher wird geändert, und die Änderung wird gespeichert. (a) Wenn das Gerät online ist, versucht es, das Änderungsset an den Server zu senden, einschließlich der Geräte-ID des Geräts, das das Änderungsset gesendet hat. (b) Wenn der Änderungssatz den Server nicht erreicht oder wenn das Gerät nicht online ist, fügt die App den Änderungssatz einer Warteschlange hinzu, die gesendet werden soll, wenn er online geschaltet wird.
- Der Server in der Cloud führt die spezifischen Änderungssätze, die er empfängt, mit seiner Masterdatenbank zusammen.
- Nachdem ein Änderungssatz (oder eine Warteschlange mit Änderungssätzen) auf dem Cloud-Server zusammengeführt wurde, überträgt der Server alle diese Änderungssätze mithilfe eines Abfragesystems auf die anderen beim Server registrierten Geräte. (Ich dachte, ich würde Apples Push-Dienste nutzen, aber laut den Kommentaren ist dies anscheinend kein funktionsfähiges System.)
Gibt es etwas Besonderes, über das ich nachdenken muss? Ich habe mir REST-Frameworks wie ObjectiveResource , Core Resource und RestfulCoreData angesehen . Natürlich arbeiten alle mit Ruby on Rails zusammen, an das ich nicht gebunden bin, aber es ist ein Anfang. Die Hauptanforderungen, die ich an meine Lösung habe, sind:
- Alle Änderungen sollten im Hintergrund gesendet werden, ohne den Hauptthread anzuhalten.
- Es sollte so wenig Bandbreite wie möglich verbraucht werden.
Ich habe über eine Reihe von Herausforderungen nachgedacht:
- Stellen Sie sicher, dass die Objekt-IDs für die verschiedenen Datenspeicher auf verschiedenen Geräten auf dem Server angehängt sind. Das heißt, ich werde eine Tabelle mit Objekt-IDs und Geräte-IDs haben, die über einen Verweis auf das in der Datenbank gespeicherte Objekt verknüpft sind. Ich werde einen Datensatz haben (DatabaseId [eindeutig für diese Tabelle], ObjectId [eindeutig für das Element in der gesamten Datenbank], Datafield1, Datafield2), das ObjectId-Feld verweist auf eine andere Tabelle, AllObjects: (ObjectId, DeviceId, DeviceObjectId). Wenn das Gerät dann einen Änderungssatz hochschiebt, leitet es die Geräte-ID und die Objekt-ID vom Kerndatenobjekt im lokalen Datenspeicher weiter. Dann prüft mein Cloud-Server die Objekt-ID und die Geräte-ID in der AllObjects-Tabelle und findet den zu ändernden Datensatz in der Anfangstabelle.
- Alle Änderungen sollten mit einem Zeitstempel versehen sein, damit sie zusammengeführt werden können.
- Das Gerät muss den Server abfragen, ohne zu viel Batterie zu verbrauchen.
- Die lokalen Geräte müssen auch alle im Speicher gespeicherten Daten aktualisieren, wenn Änderungen vom Server empfangen werden.
Fehlt mir hier noch etwas? Welche Arten von Frameworks sollte ich prüfen, um dies zu ermöglichen?