Изменения, сохраненные из одного NSManagedObjectContext, не отражают основной NSManagedObjectContext
У меня есть основной NSManagedObjectContext
который создан в appDelegate
.
Теперь я использую другой NSManagedObjectContext
для редактирования/добавления новых объектов, не затрагивая основной NSManagedObjectContext
, пока я не сохраню их.
Когда я сохраняю второй NSManagedObjectContext
, изменения не отражаются в основном NSManagedObjectContext
, но если я открою базу данных .sqlite из симулятора, изменения будут правильно сохранены в базе данных .sqlite. Не имеет значения, получу ли я данные снова или даже если создам третий NSManagedObjectContext
, я не могу увидеть эти изменения во втором NSManagedObjectContext
, несмотря на тот факт, что эти изменения действительно существуют на диске на данный момент.
Если я выйду и снова открою приложение, все изменения будут.
Что может привести к тому, что основной NSManagedObjectContext
не увидит новые изменения, присутствующие в постоянном хранилище?
До этого подхода я использовал один NSManagedObjectContext
и undoManager
, но я хотел изменить его, чтобы использовать два разных NSManagedObjectContext
.
Второе сохранение NSManagedObjectContext
:
NSError* error = nil;
if ([managedObjectContext hasChanges]) {
NSLog(@"This new object has changes");
}
if (![managedObjectContext save:&error]) {
NSLog(@"Failed to save to data store: %@", [error localizedDescription]);
NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
if(detailedErrors != nil && [detailedErrors count] > 0) {
for(NSError* detailedError in detailedErrors) {
NSLog(@" DetailedError: %@", [detailedError userInfo]);
}
}
else {
NSLog(@" %@", [error userInfo]);
}
}
Ответы
Ответ 1
Если вы этого еще не сделали, я предлагаю прочитать документацию Apple по основным данным: управление изменениями.
Вам необходимо уведомить первый контекст об изменениях, которые были сохранены через второй контекст. При сохранении контекста он NSManagedObjectContextDidSaveNotification
. Зарегистрируйтесь для этого уведомления. В методе-обработчике объедините в первом контексте изменения, сохраненные во втором контексте. Например:
// second managed object context save
// register for the notification
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(handleDidSaveNotification:)
name:NSManagedObjectContextDidSaveNotification
object:secondManagedObjectContext];
// rest of the code ommitted for clarity
if (![secondManagedObjectContext save:&error]) {
// ...
}
// unregister from notification
[[NSNotificationCenter defaultCenter]
removeObserver:self
name:NSManagedObjectContextDidSaveNotification
object:secondManagedObjectContext];
Обработчик уведомлений:
- (void)handleDidSaveNotification:(NSNotification *)note {
[firstManagedObjectContext mergeChangesFromContextDidSaveNotification:note];
}