0

我正在开发一个 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 有几个相关的对象,我以相同的方式创建并使用提供的 add...Objects 方法添加到 testObject 中。

然后,如果在保存上下文之前,我按下取消并返回主表视图,则没有按预期显示。但是,如果我重新启动应用程序,我在上下文中创建的对象会显示在主表视图中。怎么会?起初,我认为这是因为 NSFetchedResultsController 正在从缓存中读取,但正如您所见,我将其设置为 nil 只是为了进行测试。此外,[context hasChanges] 在我重新启动后返回 true。我在这里想念什么?

4

3 回答 3

1

上下文永远不会自动保存。如果您看到保存,则有一个呼叫到-save:某个地方。量子点

要确认正在将内容写入磁盘,您是否正在查看 sqlite 文件本身?您可以在那里窥视以查看正在写入的内容。如果那里什么都没有,也许你在启动时会生成默认对象或其他东西。

于 2010-06-12T20:59:28.793 回答
0

在我看来,您的取消按钮实际上并没有取消任何东西(即没有运行undorollback,如 Shaggy Frog 所述。

至于要保存的上下文,您是否首先创建了一个选中“使用核心数据进行存储”框的 Xcode 项目?如果是这样,生成的模板包括应用程序退出时的上下文保存。

- (void)applicationWillTerminate:(UIApplication *)application入您的 AppDelegate。

于 2010-07-30T10:13:40.213 回答
-1

NSManagedObjectContext如果您在重新启动应用程序时看到该对象,则您的实例将被保存。

您的取消按钮处理程序应该执行 aundo或 a rollback

于 2010-06-06T20:59:44.603 回答