我在导航栏中有一个带有加号按钮的项目列表,打开一个模态窗口,其中包含模型属性表,在单击表项时显示表单(非常标准的表单样式)。出于某种原因,如果我单击加号按钮打开表单以创建新模型,则立即单击完成按钮,将保存人员模型。链接到done按钮的操作只会调用委托方法,通知personListViewController关闭窗口。
apple docs声明在调用insertNewObjectForEntityName后没有保存模型:...
简单地创建托管对象不会导致它被保存到持久性存储中。托管对象上下文充当暂存器。
我不知道为什么会发生这种情况,但每次点击完成按钮,我在原始tableView中都有一个新的空白项目。
我使用的是SDK v3.1.3
// PersonListViewController - open modal window
- (void)addPerson {
// Load the new form
PersonNewViewController *newController = [[PersonNewViewController alloc] init];
newController.modalFormDelegate = self;
[self presentModalViewController:newController animated:YES];
[newController release];
}
// PersonFormViewController
- (void)viewDidLoad {
[super viewDidLoad];
if ( person == nil ) {
MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
self.person = [NSEntityDescription insertNewObjectForEntityForName:@"Person"
inManagedObjectContext:appDelegate.managedObjectContext];
}
...
UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
target:self action:@selector(done)];
self.navigationItem.rightBarButtonItem = doneButton;
[doneButton release];
}
- (IBAction) done {
[self.modalFormDelegate didCancel];
}
// delegate method in the original listViewController
- (void) didCancel {
[self dismissModalViewControllerAnimated:YES];
}
答案 0 :(得分:2)
如果您使用的是获取的结果控制器,它会根据上下文的状态自行更新。在您在上下文中调用save:
之前,商店不会更新,但上下文本身绝对是(否则没有任何意义)。
此外,默认情况下,当您关闭应用程序时(如果使用CoreData模板),它将保存当前上下文,因此这些更改将保持不变。
如果您不希望表视图选择更改,则必须先从上下文中删除新实体,然后再返回上一个视图,或者使用两个单独的上下文(我敦促您/不/选择此方法)除非你100%了解CoreData的工作方式。)
答案 1 :(得分:1)
你误解了文档。
将应用程序的数据视为文本文档。用户可以打开文本文档并在其中键入或删除内容,它在屏幕上显示已更改,但包含文本的文件尚未保存。这就是原始表视图所发生的情况:它是对特定时刻数据状态的直观呈现。
正如用户可以在没有将更改写入文件的情况下键入文本文档一样,应用程序的数据也会发生同样的事情。每次单击加号按钮时,都会创建一个新模型,并且应用程序可以直观地正确表示它。但是,磁盘存储没有写一件事。
当用户退出应用程序时,Xcode的默认Core Data应用程序模板将保存(将数据内容写入存储),使任何数据更改成为永久性的。在此之前,任何变化只会影响记忆中的内容。