Die Kerndatenmigration ist langsam, obwohl nichts zu migrieren ist

8

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

    
aneuryzm 11.06.2013, 09:56
quelle

2 Antworten

3

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 aktualisiert mehr als 50 Zeilen;
  • Wenn Sie dies vermeiden wollen, müssen Sie die Vererbung vermeiden;
  • Sie können vermeiden, dass Beziehungen mit Beziehungen eine Beziehung haben, aber die Zwei-Wege-Natur der Kerndaten macht dies oft zu einem Problem (wenn 30 Objekte eine Verbindung zu Item haben, muss Item 30 Verbindungen zu anderen Objekten haben) ;
  • Wenn Item nur etwas Triviales wie ein einheitlicher Zeitstempel ist, ist es in der Regel einfacher, jeder Entität eine timestamp -Eigenschaft hinzuzufügen, und jeder Aufruf hat einen gemeinsamen Code, um ihn zu erstellen.
Tommy 23.06.2013, 23:33
quelle
3

Core Data unter iOS verwendet SQLite für die Datenspeicherung. SQLite unterstützt ALTER COLUMN nicht, daher umgehen Core Data diese Einschränkung um:

  1. Umbenennen der alten Tabelle
  2. Erstellen einer neuen Tabelle mit den aktualisierten Spalten
  3. Einfügen der Datensätze in die neue Tabelle
  4. löscht die alte Tabelle

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.

    
Vinny Coyne 23.06.2013 22:59
quelle

Tags und Links