Verwenden von Core Data, iCloud und CloudKit zum Synchronisieren und Sichern und zur Funktionsweise

111

Ich bin gerade dabei, eine App zu erstellen, in der ich Daten speichern, synchronisieren und sichern möchte. Die App speichert keine Dateien, nur Daten, in einer Datenbank. Es wird iOS 8 und höher sein, damit ich CloudKit verwenden kann. Ich habe einige Nachforschungen angestellt und bin mir immer noch nicht sicher, wie Core Data, iCloud und CloudKit zusammenarbeiten.

Nach meinem Verständnis ist CloudKit nur eine Möglichkeit, Daten in die / aus der Cloud zu holen und abzurufen. Ist CloudKit nur eine andere Art, Daten mit iCloud zu synchronisieren?

Meine Fragen sind:

  1. Muss ich bei Verwendung von CloudKit noch eine lokale Kerndatendatenbank erstellen?

    • Wenn ja, wird es automatisch mit iCloud synchronisiert oder müsste ich Methoden aufrufen, um an beiden Orten zu speichern?
  2. Wenn die Daten nur in der Cloud gespeichert sind, kann der Benutzer darauf zugreifen, wenn das iOS-Gerät nicht mit dem Internet verbunden ist. Ich habe gelesen, dass CloudKit nur eingeschränkt zwischengespeichert werden kann.

  3. Wie funktioniert das, wenn das iCloud-Konto nicht aktiviert ist?

Wenn jemand die Funktionsweise der einzelnen Technologien beim Speichern und Synchronisieren der Kerndatendatenbank offline und online aufschlüsseln kann.

Mein derzeitiges Verständnis ist:

  • Kerndaten werden zum lokalen Speichern von Daten verwendet

  • iCloud synchronisiert die Daten und speichert sie in der Cloud

  • CloudKit bietet die Möglichkeit, Daten in der Cloud zu speichern und zu verwalten?

Ich hoffe, ich habe genug Informationen bereitgestellt, damit diese Frage nicht geschlossen wird.

Yan
quelle
2
Sogar ich habe nicht so viel darüber recherchiert, aber so viel ich verstanden habe, ist es nicht in der Region zu speichern. Es ist so etwas wie ein normaler Server-Client-Service. Deshalb können Sie ohne Internet nicht auf Ihre Datenbank zugreifen. und laut Doc, wenn der Benutzer das icloud-Konto zu diesem Zeitpunkt nicht aktiviert hat, können Sie nur die Daten aus dem öffentlichen Container lesen
Sachin
@Yan können wir dies tun, bitte vorschlagen, stackoverflow.com/questions/25600556/…
Nikunj

Antworten:

183

Es ist so:

  • Core Data selbst ist vollständig lokal und funktioniert nicht automatisch mit den Cloud-Diensten von Apple.
  • Kerndaten mit aktivierter iCloud aktivieren die Synchronisierung über iCloud. Alle Änderungen, die Sie in Core Data speichern, werden in die Cloud übertragen, und alle in der Cloud vorgenommenen Änderungen werden automatisch heruntergeladen. Die Daten werden sowohl in iCloud als auch in einer lokalen persistenten Speicherdatei gespeichert, sodass sie auch dann verfügbar sind, wenn das Gerät offline ist. Sie müssen keinen Cloud-spezifischen Code schreiben, sondern nur das Abhören eingehender Änderungen hinzufügen (ähnlich wie Änderungen, die in einem anderen verwalteten Objektkontext vorgenommen wurden).
  • CloudKit ist nicht mit Kerndaten verbunden. Es ist kein Synchronisationssystem, es ist ein Übertragungssystem. Dies bedeutet, dass Sie jedes Mal, wenn Sie Cloud-Daten lesen / schreiben möchten, explizite CloudKit-API-Aufrufe ausführen müssen, um dies zu tun. Nichts passiert automatisch. CloudKit speichert keine Daten auf dem Gerät, sodass die Daten nicht verfügbar sind, wenn das Gerät offline ist. CloudKit fügt außerdem einige Funktionen hinzu, die Core Data mit iCloud nicht zur Verfügung stehen, z. B. öffentliche freigegebene Daten und die Möglichkeit, nur einen Teil des Datensatzes anstelle des Ganzen herunterzuladen.

Wenn Sie CloudKit mit Kerndaten verwenden möchten, müssen Sie Ihren eigenen benutzerdefinierten Code schreiben, um zwischen verwalteten Objekten und CloudKit-Datensätzen zu übersetzen. Es ist nicht unmöglich, aber es ist mehr Code zum Schreiben. Es mag zuverlässiger sein, aber es ist noch zu früh, um es sicher zu sagen.

Ich habe einen Blog-Beitrag geschrieben, in dem CloudKit aus der Perspektive einer Person beschrieben wird, die in der Vergangenheit Core Data und iCloud verwendet hat.

Update , Juni 2016: Ab der neuesten Dokumentation fürNSPersistentStoreCoordinator ist alles, was mit Core Data mit iCloud zu tun hat, als veraltet markiert. Infolgedessen sollte es wahrscheinlich für neue Entwicklungen vermieden werden.

Tom Harrington
quelle
1
In der Vergangenheit hatte ich Probleme mit Korruption bei der Verwendung von Core Data mit iCloud, aber ich habe es seit dem Erscheinen von iOS 7 nicht mehr oft verwendet. Es soll viel besser sein. Mit CloudKit ist es noch zu früh zu sagen, da es noch nicht offiziell veröffentlicht wurde.
Tom Harrington
3
@ Tom Harrington - Könnten Sie Core Data mit iCloud für iOS 8 ausprobieren und uns Ihren Eindruck mitteilen? Ich habe auch in iOS 7 viele Korruption erfahren, und der Apple-Support hat viele Fehler bestätigt. Ich hoffe, dass iOS 8 seine Zuverlässigkeit auf ein akzeptables Niveau bringt, würde aber gerne von Ihnen, dem Experten, hören;)
Hyouuu
1
Schauen Sie sich CKSIncrementalStore an. github.com/CloudKitSpace/CKSIncrementalStore
Nofel Mahmood
3
"Sie müssen keinen Cloud-spezifischen Code schreiben, sondern nur das Abhören eingehender Änderungen hinzufügen (ähnlich wie Änderungen, die in einem anderen verwalteten Objektkontext vorgenommen wurden)." - Haben Sie ein Codebeispiel / Beispiel für diesen Kommentar? Es gibt keine soliden Beispiele, die ich finden kann :(
Ernest
1
@ TomHarrington mit dieser Art von Feedback, warum sogar Stackoverflow haben, wenn wir nur die Dokumentation überprüfen müssen :(
Ernest
14

Mit iOS 13 kündigte Apple neue Funktionen in Core Data an, um besser mit CloudKit arbeiten zu können. Der Hauptzusatz ist NSPersistentCloudKitContainer, der im Grunde die Synchronisierung zwischen Core Data und CloudKit für Sie verwaltet.

Weitere Informationen finden Sie in der WWDC-Sitzung Verwenden von Kerndaten mit CloudKit .

Apple hat auch eine schöne Sammlung von Dokumenten für genau diese Verwendung veröffentlicht: Spiegeln eines Core Data Store mit CloudKit .

Pomme2Poule
quelle