objective-c - framework - tutorial django
Versiones y migraciones de Core Data con política personalizada (2)
Bueno, lo hice ...
Mis primeros 3 pasos fueron correctos. Continuar escenario:
ADD4. Realice una ItemToItemMigrationPolicy
, una subclase de NSEntityMigrationPolicy
. Anular:
- (BOOL)beginEntityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error
{
List* list = (List*)[NSEntityDescription insertNewObjectForEntityForName:@"List" inManagedObjectContext:[manager destinationContext]];
list.name = @"Default list";
return YES;
}
- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error
{
Item* item = (Item*)[NSEntityDescription insertNewObjectForEntityForName:[mapping destinationEntityName] inManagedObjectContext:[manager destinationContext]];
item.dateAdded = [NSDate date];
task.title = [sInstance valueForKey:@"name"];
[manager associateSourceInstance:sInstance withDestinationInstance:item forEntityMapping:mapping];
return YES;
}
- (BOOL)createRelationshipsForDestinationInstance:(NSManagedObject *)dInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error
{
NSFetchRequest* fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"List"];
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"name LIKE ''Default list''"];
fetchRequest.predicate = predicate;
NSError* fetchRequestError = nil;
NSArray* listsArray = [manager.destinationContext executeFetchRequest:fetchRequest error:&fetchRequestError];
if (fetchRequestError) {
NSLog(@"%@", fetchRequestError.localizedDescription);
}
List* list = [listsArray lastObject];
((Item*)dInstance).list = list;
return YES;
}
ADD5. En Xcode, en el modelo de mapeo, configure la política de migración de ItemToItem como personalizada con el valor ItemToItemMigrationPolicy
.
ADD6. Haga que su nueva versión de modelo sea actual y genere (reemplace) clases de entidades nuevas o modificadas.
ADD7. Haz cambios en tu código, por ejemplo item.name
no funciona más. Ahora es item.title
. Limpiar proyecto y ejecutar.
Encontré documentación muy limitada y mi solución problema en ninguna parte.
Necesito agregar una nueva entidad (con relación a la existente). También agregue y cambie el nombre de algunos de los atributos de la entidad existente.
Ejemplo ligero:
El modelo anterior tiene una entidad Item
con un name
atributo.
En el nuevo modelo, quiero que el Item
tenga una nueva fecha de atributo. dateAdded
y cambio de name
a title
. En este punto, si dateAdded
fuera opcional o se le otorgara un valor predeterminado, podría usar la función de migración liviana. Corrígeme si estoy equivocado.
Pero también quiero agregar una nueva entidad de List
con el atributo de title
. Y agrega una relación a muchos. La lista puede estar vacía o tener muchos elementos. El artículo tiene que referirse exactamente a una lista.
Así que estoy confundido en lo que tengo que hacer y en qué orden.
Active la migración con la característica de migración
NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:NO], NSInferMappingModelAutomaticallyOption, nil];
desactivada (NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:NO], NSInferMappingModelAutomaticallyOption, nil];
).Crea una nueva versión del modelo. Ahí hago los cambios que quiero.
Crea un nuevo modelo de mapeo. La fuente es el modelo anterior, el objetivo es un nuevo modelo. En
ItemToItem
, establecí eltitle
en$source.name
.
Además de que Xcode sigue fallando al trabajar con el modelo de mapeo, no sé qué hacer a continuación. Creo que tengo que crear una instancia de List
en contexto y hacer que todos los elementos se refieran a ella debido a la política de relación. Y creo que debería usar NSEntityMigrationPolicy
personalizado para hacer esto. ¿Alguna ayuda para lograr este desafío?
Si está agregando una nueva entidad, necesitará usar un modelo de asignación personalizado y desactivar la migración ligera.
Una cosa importante Cuando trabaje con la migración, asegúrese de comenzar con un nuevo ejemplo de la tienda permanente existente, especialmente si ha tenido fallas. Si no lo hace, puede corromper la tienda, lo que hará que los errores crezcan como una bola de nieve.