CoreData IOS: Cómo crear un objeto con valores sin que se marque como que tiene cambios

No tengo idea de lo complicado que puede ser esto,

Tengo una aplicación que usa CoreData.

Cuando creo un nuevo objeto administrado, relleno sus campos con valores predeterminados almacenados en una lista.

Luego muestro un montón de formularios (cargando los valores guardados en los formularios y actualizando los valores del objeto a medida que avanzo).

Y al final compruebo si el objeto tiene cambios y sugiero guardar el objeto.

Esta parte funciona bien.

Sin embargo, cuando tengo problemas cuando el usuario presiona "Atrás" en la interfaz. Quiero poder mostrar una Alerta si el usuario ha cambiado algo en el objeto o dejar que el usuario regrese si no se ha cambiado nada.

Sin embargo, me gustaría que tuviera cambios, ya que relleno el objeto con datos predeterminados, CoreData concede que el objeto se ha cambiado para empezar.

Entonces, ¿cómo puedo crear un nuevo objeto administrado e inicializarlo sin que se considere como cambios?

- (Company *)createNewDefaultCompany:(NSString *)name{
    Company *company = [Company insertInManagedObjectContext:managedObjectContext];
    [company setName:name];
    [company setDate:[NSDate date]];
    [company setLocalisation:@"en_UK"];

    Input *input = [Input insertInManagedObjectContext:managedObjectContext];
    [input populateWithDefault];
    [company setCompanyInputs:input];

    Formulas *formulas = [Formulas insertInManagedObjectContext: managedObjectContext];
    [formulas populateWithDefault];
    [company setCompanyFormula:formulas];

    [company createCalculus];
    return company;
} 

La creación del objeto gestionado.

+(Company *)insertInManagedObjectContext:(NSManagedObjectContext *)managedObjectContext{
    return (Company *)[NSEntityDescription insertNewObjectForEntityForName:@"Company" inManagedObjectContext:managedObjectContext]; 
}

preguntado el 03 de mayo de 12 a las 19:05

3 Respuestas

Realmente no puedo probar esto, pero lo que podría considerar hacer es guardar el contexto del objeto administrado después de su company El objeto administrado está configurado y luego verifica los cambios después de guardar. Para deshacerse de su nuevo objeto si el usuario se retira, simplemente puede llamar al deleteObject en su contexto administrado, pasándole la referencia a su nuevo objeto. Solo asegúrese de guardar el contexto nuevamente después de eliminar el objeto.

contestado el 03 de mayo de 12 a las 20:05

Una vez que la forma posible de hacer esto sería usar un NSUndoManager en el contexto de su objeto administrado. Puede envolver su configuración de valor predeterminado en un bloque de código donde se deshabilitó el registro de deshacer:

- (Company *)createNewDefaultCompany:(NSString *)name{
    [[managedObjectContext undoManager] disableUndoRegistration];

    Company *company = [Company insertInManagedObjectContext:managedObjectContext];
    [company setName:name];
    [company setDate:[NSDate date]];
    [company setLocalisation:@"en_UK"];

    Input *input = [Input insertInManagedObjectContext:managedObjectContext];
    [input populateWithDefault];
    [company setCompanyInputs:input];

    Formulas *formulas = [Formulas insertInManagedObjectContext: managedObjectContext];
    [formulas populateWithDefault];
    [company setCompanyFormula:formulas];

    [company createCalculus];

    [managedObjectContext processPendingChanges];
    [[managedObjectContext undoManager] enableUndoRegistration];

    return company;
} 

y luego verifique el canUndo estado en el administrador de deshacer. Suponiendo que no haya acciones que se puedan deshacer en este controlador de vista (puede borrar esto con -removeAllActions en su administrador de deshacer al ingresar o salir del controlador de vista), el estado de deshacer debe reflejar si se realizaron cambios después de crear e inicializar este NSManagedObject.

Sin embargo, esta podría no ser la mejor solución si desea usar Deshacer en otro lugar con el contexto de su objeto administrado, dada la necesidad de borrar el estado Deshacer antes de crear el objeto de la empresa.

contestado el 03 de mayo de 12 a las 20:05

Para asegurarse de que NSManagedObject no esté marcado como cambiado, no debe usar los configuradores normales, sino usar setPrimitiveValue: en su lugar. Por cierto: normalmente, la inicialización de NSManagedObject se realiza en el método wakeFromInsert.

Respondido 19 Feb 14, 13:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.