Базовые данные: сброс в исходное состояние - PullRequest
12 голосов
/ 06 февраля 2010

У меня есть объект, я делаю в нем некоторые изменения, но не хочу их сохранять, мне нужны «старые» значения.

Я пробовал с:

[managedObjectContext rollback];
[managedObjectContext redo];
[managedObjectContext reset];

и, похоже, ни один из них не работает ...

NSLog(@"current: %@",ingredient.name); // ===> bread
[ingredient setName:@"test new data"];
NSLog(@"new: %@",ingredient.name); // ===> test new data

[managedObjectContext rollback];
[managedObjectContext redo];
[managedObjectContext reset];

NSLog(@"current: %@",ingredient.name); // ===> test new data

// I want again ===> bread

Должен ли я повторно получить объект?

спасибо,

г.

Ответы [ 3 ]

24 голосов
/ 07 февраля 2010

Оберните ваши изменения в NSUndoManager beginUndoGrouping, а затем NSUndoManager endUndoGrouping, а затем NSUndoManager undo.

Это правильный способ откатить изменения. NSManagedObjectContext имеет собственный внутренний NSUndoManager, к которому вы можете получить доступ.

Обновление, показывающее пример

Поскольку NSUndoManager по умолчанию на Cocoa Touch равен nil, вам нужно создать один и установить его в NSManagedObjectContext first.

//Do this once per MOC
NSManagedObjectContext *moc = [self managedObjectContext];
NSUndoManager *undoManager = [[NSUndoManager alloc] init];
[moc setUndoManager:undoManager];
[undoManager release], undoManager = nil;

//Example of a grouped undo
undoManager = [moc undoManager];
NSManagedObject *test = [NSEntityDescription insertNewObjectForEntityForName:@"Parent" inManagedObjectContext:moc];
[undoManager beginUndoGrouping];
[test setValue:@"Test" forKey:@"name"];
NSLog(@"%s Name after set: %@", __PRETTY_FUNCTION__, [test valueForKey:@"name"]);
[undoManager endUndoGrouping];
[undoManager undo];
NSLog(@"%s Name after undo: %@", __PRETTY_FUNCTION__, [test valueForKey:@"name"]);

Также убедитесь, что ваши аксессоры соблюдают правила КВО и публикуют уведомления -willChange:, -didChange:, -willAccess: и -DidAccess:. Если вы просто используете @dynamic аксессоры, то все будет в порядке.

4 голосов
/ 20 июля 2012

Согласно документации Apple

Использование

- (void)rollback; 
[managedObjectContext rollback];

Удаляет все из стека отмены, удаляет все вставки и удаления и восстанавливает обновленные объекты до их последних зафиксированных значений.

Здесь

2 голосов
/ 06 февраля 2010

Попробуйте [managedObjectContext refreshObject:ingredient mergeChanges:NO] до второго NSLog вызова.

...