2016-04-08 8 views
0

Ich habe ein Core Data-Objektmodell alle verwalteten in einer iOS-App einzurichten und zu arbeiten, und ich bin mit NSManagedObject Subklassen, die [[MyEntityClass alloc] initWithEntity:description insertIntoManagedObjectContext:context]; instanziiert verwendenLeichtgewichtige Migration von Core Data - werden vorhandenen Entitäten neue Attribute hinzugefügt?

ich einige Tutorials auf Core Data Migrationen gelesen haben für möglich vorzubereiten zukünftige Updates für die App. Für die Änderungen, die ich derzeit für diesen speziellen Fall vorschlage, bin ich zuversichtlich, dass eine leichte Migration ausreichend sein wird. Ich verstehe, dass die einfache Migration die Daten vom alten Datenmodell auf die neue Version abbildet. Aber eine Sache ist mir nicht klar. Wenn der persistente Speicher NSMagedObject-Unterklassen-Instanzen enthält, die vor der Migration erstellt wurden, werden diese Objekte zusammen mit dem Modell geändert, damit sie die in der Migration hinzugefügten Attribute verwenden können?

Ich werde ein Beispiel geben, um sicherzustellen, dass ich klar darüber bin, was ich verlange. Sagen wir, ich habe eine Entität aufgerufen, um das klassische Beispiel zu verwenden, Person. Person hat folgende Attribute:

firstname 
lastname 

ich eine Instanz von Person genannt aPerson und dies wird in den persistenten Speicher eingefügt. Ich kann auf die Attribute aPerson unter Verwendung von aPerson.firstname und aPerson.lastname zugreifen.

Jetzt füge ich ein dateofbirth Attribut auf das Objektmodell verwaltet werden, so dass die Person Einheit enthält folgende Attribute:

firstname 
lastname 
dateofbirth 

Nun, was passiert, wenn ich aPerson aus dem persistenten Speicher abrufen und versuchen aPerson.dateofbirth zugreifen? Erhalte ich einen nicht erkannten Selektorfehler, weil aPerson das Attribut dateofbirth nicht enthält, weil es vor dem Hinzufügen dieses Attributs erstellt wurde? Oder fügt die Lightweight-Migration das Attribut dateofbirth und die Zugriffsmethoden allen Instanzen von Person hinzu, die sich bereits im persistenten Speicher befinden?

Antwort

1

Wenn Sie einer neuen Modellversion ein Attribut hinzufügen, muss das Attribut entweder optional sein oder Sie müssen einen Standardwert angeben. Andernfalls würde der mit dem alten Modell gespeicherte persistente Speicher nicht mit dem neuen Modell validiert.

In Ihrem Beispiel ist es nicht sinnvoll, einen Standard dateofbirth anzugeben, damit Sie dieses Attribut optional machen und damit zurechtkommen, dass es manchmal nicht vorhanden ist.

Ich kann keine explizite Dokumentation zu diesem finden. Sie sollten Migrationen sehr gründlich testen.

+0

Vielen Dank, das ist sehr hilfreich! Wenn Sie also sagen, dass das Attribut nicht vorhanden ist, würde das etwas wie "if ([myEntity responseToSelector: @selector (myMigratedAttributeName)) {...}' – mashers

+0

Nein, Methoden betreffen Klassen, nicht Instanzen. Sie lesen die Eigenschaft und sehen, ob es "Null" ist. –

+0

'Methoden sind auf Klassen, nicht auf Instanzen '- Ja, aber würde nicht' antwortenToSelector: 'überprüfen, dass die Eigenschaft in der NSManagedObject-Unterklasse vorhanden ist? Wenn die Entitätsunterklasse erstellt wurde, bevor die Datenmigration versucht hat, auf die hinzugefügte Eigenschaft zuzugreifen, geben Sie einfach nil zurück oder würde dies zu einer nicht erkannten Selektorausnahme führen? – mashers

Verwandte Themen