2016-04-29 9 views
2

Ich migrieren ein Datenmodell mit einem Mapping-Modell.Core Data umbenennen Attribut "gelöscht"

Ein Unternehmen hat ein Attribut namens gelöscht die Migration nicht, weil Core Data nimmt die Eigenschaft des NSManagedObject anstelle von mir gelöscht.

Wie kann ich das Mapping-Modell zwingen, mein Attribut zu verwenden?

Gibt es irgendetwas, das ich im Wertausdruck verwenden kann? Dies ist, was ich jetzt:

enter image description here

Danke.

+0

Ich würde versuchen "isDeleted" oder "getDeleted" - obwohl ich fürchte, sie werden das gleiche Problem haben (wenn sie überhaupt funktionieren). – pbasdf

+0

Siehe hier: http://StackOverflow.com/a/16003894/826716 und hier: http://StackOverflow.com/a/4718806/826716. Ich fürchte, das ist mit einer leichten Migration nicht möglich. Vielleicht lohnt es sich, 'NSMigrationManager' zu versuchen: https://www.objc.io/issues/4-core-data/core-data-migration/. – bteapot

+0

Ich würde nicht einmal den Weg der starken Migration gehen, eine leichte Migration und dann Datenverarbeitung nach der Migration. –

Antwort

0

ich die Lösung gefunden habe:

ich eine benutzerdefinierte MigrationPolicy wie folgt umgesetzt:

- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sourceInstance 
            entityMapping:(NSEntityMapping *)mapping 
             manager:(NSMigrationManager *)manager 
              error:(NSError *__autoreleasing *)error 
{ 
    NSManagedObject *newObject = [NSEntityDescription insertNewObjectForEntityForName:[mapping destinationEntityName] inManagedObjectContext:[manager destinationContext]]; 

    // Add the old 'deleted' attribute to a renamed attribute 
    [newObject setValue:[NSNumber numberWithBool:[((OldEntityModel *)sourceInstance) deleted]] forKey:@"newDeletedAttribute"]; 

    // Add all the other attributes 
    [newObject setValue:[sourceInstance valueForKey:@"field1"] forKey:@"field1"]; 
    [newObject setValue:[sourceInstance valueForKey:@"field2"] forKey:@"field2"]; 

    // Add the relationships 
    NSSet *relationshipAttribute = [[NSSet alloc] initWithArray:[manager destinationInstancesForEntityMappingNamed:@"OtherEntityToOtherEntity" sourceInstances:@[[sourceInstance valueForKey:@"relationshipAttribute"]]]]; 
    [newObject relationshipAttribute forKey:@"relationshipAttribute"]; 

    [manager associateSourceInstance:sourceInstance withDestinationInstance:newObject forEntityMapping:mapping]; 

    return YES; 
} 

Casting der sourceEntity auf die alten Modellversion erlaubt den Zugriff auf die gelöscht zugeschrieben Das war in leichten Migrationen oder Mapping-Modellen nicht möglich.

1

Leider haben Sie ein reserviertes Wort verwendet (von dem ich vermute, dass es zu der Zeit eine Warnung gab).

Ihre beste Wette ist eine leichte Migration und dieser Wert wird NICHT migrieren. Dann nach der Migration; Iteriere über die Daten und aktualisiere den Wert manuell pro Objekt. Sie müssen dies nur einmal tun, denn sobald die Migration abgeschlossen ist, ist die alte reservierte Worteigenschaft verschwunden.

+0

Vielen Dank, aber wie kann ich dieses Attribut aktualisieren, wenn ich den Wert während der Lightweight-Migration verloren habe? – Matt39

+0

Sie erstellen ein neues Attribut, ohne das alte zu entfernen und dann zu migrieren. Nach der Migration durchlaufen Sie die Objekte und setzen den neuen Wert auf den alten Wert. Zu einem späteren Zeitpunkt können Sie den alten, jetzt nicht verwendeten Wert entfernen. –