2016-11-23 1 views
0

Ich habe, was fühlt sich sollte ein einfaches Problem sein, kann aber keine einfache Antwort finden.Kerndatenmigration: Wie man neues Attribut auffüllt?

Ich habe eine einfache Migration, ich muss nur eine synthentische Eigenschaft für die Verwendung in einem abgerufenen Ergebnis-Controller hinzufügen. Diese neue Eigenschaft ist nur ein BOOL (zum Sortieren verwendet), der von einer anderen Eigenschaft abgeleitet ist.

Beispiel:

var title: String? // "engineer" | "accountant" 
var hasTitle: Bool // title != nil 

einfach, ich brauche das neue Feld hinzufügen hasTitle (was trivial scheint), und die es einmal füllen. Ich möchte diesen Code von meiner normalen App-Logik fernhalten, damit ich nicht alle meine Schemaänderungen in einem Protokoll erfassen muss.

Ist es möglich, eine einfache Migration durchzuführen, gefolgt von einer isolierten, einmaligen Massenaktualisierung, oder muss ich eine benutzerdefinierte/schwergewichtige Migration durchführen.

Und zweitens, wenn ich eine benutzerdefinierte Migration tun muß, gibt es mildernde Techniken - kann ich einen Wertausdruck „Funktion“ verwenden, um das oben genannte zu tun initialisieren

Was ich will (title = null!) meiden muss ein NSUserDefaults-Flag für eine Migration festlegen und das bei jedem Start überprüfen. Ich möchte die Komplexität der Migration auf migrationsspezifischen Code einschränken und die normale App-Logik nicht belasten.

Danke!

Antwort

1

Ist es möglich, eine leichtgewichtige Migration durchzuführen, gefolgt von einem isolierten, einmaligen Massenupdate, oder muss ich eine benutzerdefinierte/schwergewichtige Migration durchführen.

Beide sind möglich. Ich würde mit einer benutzerdefinierten Migration fortfahren, einfach weil es Ihnen vor Code schützt, der jedes Mal, wenn die App gestartet wird, nach dem neuen Attribut sucht. Für eine einfache Änderung wie die Ihre ist es ziemlich einfach, obwohl es für die meisten iOS-Entwickler Neuland ist. I recently described the process in detail in einer anderen Antwort.

Wenn Sie nicht mit einer benutzerdefinierten Migration arbeiten, müssen Sie das neue Attribut optional machen und dann einen benutzerdefinierten Code hinzufügen, um zu prüfen, ob ein Wert vorhanden ist, und einen zuweisen, falls dies nicht der Fall ist. Es mag einfacher erscheinen, aber das liegt nur daran, dass es Ihnen wahrscheinlich vertrauter erscheint. Core Data wird Sie davor bewahren, diese Art von Prüfung in Ihren App-Startprozess einzufügen und sicherzustellen, dass Ihr Conversion-Code nur dann ausgeführt wird, wenn eine Conversion tatsächlich benötigt wird.

Verwandte Themen