我正在开发一个在主表视图控制器中使用NSFetchedResultsController的iPhone应用程序。我在主表视图控制器的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中。
然后,如果在保存上下文之前,我按cancel并返回到主表视图,则不会按预期显示任何内容。但是,如果我重新启动应用程序,我在上下文中创建的对象将显示在主表视图中。怎么会这样?起初,我认为这是因为NSFetchedResultsController正在从缓存中读取数据,但正如您所看到的,我将其设置为nil只是为了进行测试。此外,在我重新启动后,context hasChanges返回true。这里我漏掉了什么?
发布于 2010-06-13 04:59:29
上下文永远不会自动保存。如果您看到的是保存,则说明某个地方调用了-save:
。QED
为了确认正在向磁盘写入内容,您是否正在查看sqlite文件本身?你可以偷看里面,看看正在写的是什么。如果其中什么都没有,那么可能是在启动时生成默认对象或其他东西。
发布于 2010-07-30 18:13:40
在我看来,你的取消按钮实际上并没有取消任何东西(例如,没有运行undo
或rollback
,就像Shaggy Frog所说的那样)。
至于要保存的上下文,您是否在创建Xcode项目时选中了"Use Core Data for storage“框?如果是,则生成的模板将在应用程序退出时包含上下文保存。
在AppDelegate中签入- (void)applicationWillTerminate:(UIApplication *)application
。
发布于 2010-06-07 04:59:45
如果您在重新启动应用程序时看到对象,则将保存您的NSManagedObjectContext
实例。
您的cancel按钮处理程序应该执行undo
或rollback
操作。
https://stackoverflow.com/questions/2985728
复制相似问题