Базовые Данные: Сброс к начальному состоянию

У меня есть объект, я вношу некоторые изменения в него, но я не хочу сохранять их, я хочу 'старые' значения.

Я попробовал:

[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

Я должен повторно выбрать объект снова?

спасибо,

r.

12
задан mongeta 6 February 2010 в 19:08
поделиться

2 ответа

Оберните свои изменения в NSUndoManager beginUndoGrouping , а затем в NSUndoManager endUndoGrouping с последующим NSUndoManager .

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

Обновление показывает пример

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

//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"]);

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

24
ответ дан 2 December 2019 в 05:03
поделиться

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

2
ответ дан 2 December 2019 в 05:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: