Wie (und wann) verwende ich die iCloud-Methode encodeSystemFields für CKRecord?

7

encodeSystemFields soll verwendet werden, wenn ich Datensätze lokal in einer Datenbank verwalte.

Wenn ich diese Daten exportiert habe, muss ich beim Deinserialisieren irgendetwas Spezielles tun?

In welchen Szenarien sollte ich nach Informationen in diesen Daten handeln?

Was kann ich als Variation (und wenn nicht in der vorherigen Frage behandelt) vor diesen Informationen schützen? (Daten Korruption nehme ich an)

    
CHI Coder 007 28.09.2016, 02:41
quelle

1 Antwort

19

encodeSystemFields ist nützlich, um zu vermeiden, dass Sie erneut ein CKRecord von CloudKit holen müssen, um es zu aktualisieren (ohne Datensatzkonflikte).

Die Idee ist:

Wenn Sie die Daten für einen Datensatz speichern, der von CloudKit abgerufen wurde (z. B. über abgerufen CKFetchRecordZoneChangesOperation , um Datensatzänderungen in einem lokalen Speicher zu synchronisieren):

1.) Archivieren Sie den CKRecord in NSData:

%Vor%

2.) Speichern Sie die archivierten Daten lokal (z. B. in Ihrer Datenbank), die Ihrem lokalen Datensatz zugeordnet sind.

Wenn Sie Änderungen an Ihrem lokalen Datensatz in CloudKit speichern möchten :

1.) Entpacken Sie den CKRecord von den gespeicherten NSDaten:

%Vor%

2.) Verwenden Sie diesen nicht archivierten Datensatz als Basis für Ihre Änderungen. (d. h., setze die geänderten Werte darauf)

%Vor%

3.) Speichern Sie die Datensätze in CloudKit über CKModifyRecordsOperation.

Warum?

Von Apple:

  

Datensätze lokal speichern

     

Wenn Sie Datensätze in einer lokalen Datenbank speichern, verwenden Sie die Methode encodeSystemFields (with :), um die Metadaten des Datensatzes zu codieren und zu speichern. Die Metadaten enthalten die Datensatz-ID und das Änderungs-Tag, das später benötigt wird, um Datensätze in einer lokalen Datenbank mit den von CloudKit gespeicherten zu synchronisieren.

Wenn Sie Änderungen an einem CKRecord in CloudKit speichern, müssen Sie die Änderungen auf dem Servereintrag speichern .

Sie können nicht einfach ein neues CKRecord mit derselben recordID erstellen, die Werte festlegen und speichern. Wenn Sie dies tun, erhalten Sie einen "Server Record Changed" -Fehler - der in diesem Fall daran liegt, dass der vorhandene Serverdatensatz Metadaten enthält, deren lokaler Datensatz (von Grund auf neu erstellt) fehlt.

Sie haben also zwei Möglichkeiten, dies zu lösen:

  1. Fordern Sie das CKRecord von CloudKit (mit der recordID) an, nehmen Sie Änderungen an diesem CKRecord vor und speichern Sie es dann wieder in CloudKit.

  2. Verwenden Sie encodeSystemFields . Speichern Sie die Metadaten lokal und heben Sie die Archivierung auf, um ein Basis-CKRecord mit allen geeigneten Metadaten zum Speichern von Änderungen an CKRecord in CloudKit zu erstellen.

    >

# 2 speichert Netzwerk-Round-Trips *.

* Angenommen, ein anderes Gerät hat den Datensatz zwischenzeitlich nicht geändert - was auch diese Daten verhindern. Wenn ein anderes Gerät den Datensatz zwischen dem Zeitpunkt, zu dem Sie es zuletzt abgerufen haben, und dem Zeitpunkt, an dem Sie es speichern, ändert, lehnt CloudKit (standardmäßig) Ihren Datensatzspeicherversuch mit "Server Record Changed" ab. Dies ist der Schlüssel zur Konfliktlösung in der für Ihre App und Ihr Datenmodell geeigneten Weise. (Häufig, indem Sie den neuen Serverdatensatz aus CloudKit abrufen und entsprechende Wertänderungen erneut auf diesen CKRecord anwenden, bevor Sie das Speichern erneut versuchen.)

HINWEIS: Jedes Mal, wenn Sie einen aktualisierten CKRecord zu / von CloudKit speichern / abrufen, müssen Sie daran denken, Ihr lokal gespeichertes archiviertes CKRecord zu aktualisieren.

    
breakingobstacles 28.09.2016, 04:22
quelle

Tags und Links