NSManagedObjectContext автоматически сохраняется или я смотрю в кэш NSFetchedResultsController? - PullRequest
0 голосов
/ 07 июня 2010

Я разрабатываю приложение для iPhone, в котором я использую NSFetchedResultsController в главном контроллере табличного представления.Я создаю его следующим образом в viewDidload основного контроллера табличного представления:

NSSortDescriptor *sortDescriptorDate = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES];
 NSSortDescriptor *sortDescriptorTime = [[NSSortDescriptor alloc] initWithKey:@"start" ascending:YES];
 NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptorDate,sortDescriptorTime, nil];
 [fetchRequest setSortDescriptors:sortDescriptors];
 [sortDescriptorDate release];
 [sortDescriptorTime release];
 [sortDescriptors release]; 




 controller = [[NSFetchedResultsController alloc]
      initWithFetchRequest:fetchRequest
      managedObjectContext:context
      sectionNameKeyPath:@"date"
      cacheName:nil];
 [fetchRequest release];

 NSError *error;
 BOOL success = [controller performFetch:&error];

Затем в следующем представлении я создаю новый объект в контексте:

  TestObject *testObject = [NSEntityDescription insertNewObjectForEntityForName:@"TestObject" inManagedObjectContext:context];

TestObject имеет несколько связанных объектов, которые я создаю таким же образом и добавляю в testObject, используя предоставленные методы add ... Objects.

Затем, если перед сохранением контекста я нажимаю отмену и возвращаюсь к главномуВ табличном представлении ничего не отображается, как ожидалось.Однако, если я перезапущу приложение, объект, который я создал в контексте, отобразится в главном табличном представлении.Как так?Сначала я думал, что это потому, что NSFetchedResultsController считывал данные из кеша, но, как вы можете видеть, я установил значение nil только для проверки.Кроме того, [context hasChanges] возвращает true после перезапуска.Что мне здесь не хватает?

Ответы [ 3 ]

1 голос
/ 13 июня 2010

Контекст никогда не сохраняется автоматически. Если вы видите сохранения, то есть звонок на -save: где-то. QED

Чтобы убедиться, что что-то записывается на диск, вы смотрите на сам файл sqlite? Вы можете заглянуть туда, чтобы увидеть, что пишется. Если там ничего нет, возможно, вы генерируете объекты по умолчанию или что-то запускается.

0 голосов
/ 30 июля 2010

Мне кажется, что ваша кнопка отмены на самом деле ничего не отменяет (т. Е. Не работает undo или rollback, как утверждает Shaggy Frog.

Что касается сохраняемого контекста, вы начали с создания проекта XCode с установленным флажком «Использовать основные данные для хранения»? Если это так, сгенерированный шаблон включает сохранение контекста при выходе из приложения.

Регистрация - (void)applicationWillTerminate:(UIApplication *)application в вашем AppDelegate.

0 голосов
/ 07 июня 2010

Ваш экземпляр NSManagedObjectContext сохраняется, если вы видите объект при перезапуске приложения.

Ваш обработчик кнопки отмены должен сделать undo или rollback.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...