Ich habe ein neues Modell erstellt und zwei Felder einer Entität umbenannt. Diese Entität wurde in der vorherigen App-Version nie verwendet. Daher wurde sie nicht der neuen aktualisierten Entität in der Datenbank zugeordnet. Folglich weist das Mapping nichts Neues auf, aber die Migration ist sehr langsam (3 Sekunden für ungefähr 50 Zeilen in der Haupttabelle). Ich frage mich, ob Kerndaten eine neue Datenbank erstellen und die ältere löschen und alle Daten erneut einfügen. Dies ist die Migrationsprotokolldatei: Ссылка
ps. Wenn NSInferMappingModelAutomaticallyOption
JA ist, bedeutet dies, dass ich möglicherweise Datenverluste erleiden kann, da das Mapping von Kerndaten improvisiert wird?
Danke
Können Sie uns Ihr Datenbankschema zeigen? Meine Vermutung ist, dass Sie die Objektvererbung großzügig verwendet haben.
Core Data implementiert die Vererbung in SQL-Stores, indem eine einzelne Tabelle für die übergeordnete Entität erstellt und Spalten für die Vereinigung aller von untergeordneten Entitäten verwendeten Felder hinzugefügt werden. Sie könnten also denken, Sie hätten nur zwei Felder in einer Entität umbenannt, aber Core Data muss Änderungen an jedem Objekt vornehmen, das von dieser Entität erbt oder einen gemeinsamen Vorgänger dieser Entität hat.
In Ihrem spezifischen Schema sieht es so aus, als hätten Sie eine Entität, Artikel, von der mindestens Genre, AudioTrack, Studio, Regisseur, Geschäft, Film, Bedingung, Region, Besitzer, AspectRatio, Jahr, MyBewertung, Episode, Ausgabe, Format , Producer, Writer, AudienceRating, SeenIt und Movie fallen ab. Es kann andere geben, da ich Ihr Protokoll mit dem Auge lese, anstatt es automatisch zu analysieren. Core Data erstellt also eine Tabelle namens Item, in der jede Instanz dieser Entitäten gespeichert wird. Wenn sich eine dieser Entitäten (oder die anderen, die ich möglicherweise nicht gefunden habe) ändert, müssen Core Data die Datensätze für alle Instanzen jeder dieser Entitäten aktualisieren.
Deshalb sehen Sie:
%Vor%Das ist die Tabelle, die die Vereinigung aller Felder aller Nachkommen von Item enthält. Es ist auch warum z. Ein Abruf für AudienceRatings wird wie folgt ausgeführt:
%Vor%Also:
Core Data unter iOS verwendet SQLite für die Datenspeicherung. SQLite unterstützt ALTER COLUMN
nicht, daher umgehen Core Data diese Einschränkung um:
Es gibt eine gute SO Antwort hier , die das etwas detaillierter beschreibt.
Ich habe nie Probleme mit Core Data Daten während der Durchführung dieser Operation gesehen - ich würde annehmen, dass Apple Sicherheitsmaßnahmen implementiert haben, um dies zu verhindern, aber es ist wahrscheinlich wert, mit Apple DTS direkt zu kontaktieren, um zu bestätigen.