CoreData正在保存模型而不调用save:方法

时间:2010-04-08 23:33:03

标签: iphone core-data

我在导航栏中有一个带有加号按钮的项目列表,打开一个模态窗口,其中包含模型属性表,在单击表项时显示表单(非常标准的表单样式)。出于某种原因,如果我单击加号按钮打开表单以创建新模型,则立即单击完成按钮,将保存人员模型。链接到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];
}

2 个答案:

答案 0 :(得分:2)

如果您使用的是获取的结果控制器,它会根据上下文的状态自行更新。在您在上下文中调用save:之前,商店不会更新,但上下文本身绝对是(否则没有任何意义)。

此外,默认情况下,当您关闭应用程序时(如果使用CoreData模板),它将保存当前上下文,因此这些更改将保持不变。

如果您不希望表视图选择更改,则必须先从上下文中删除新实体,然后再返回上一个视图,或者使用两个单独的上下文(我敦促您/不/选择此方法)除非你100%了解CoreData的工作方式。)

答案 1 :(得分:1)

你误解了文档。

将应用程序的数据视为文本文档。用户可以打开文本文档并在其中键入或删除内容,它在屏幕上显示已更改,但包含文本的文件尚未保存。这就是原始表视图所发生的情况:它是对特定时刻数据状态的直观呈现。

正如用户可以在没有将更改写入文件的情况下键入文本文档一样,应用程序的数据也会发生同样的事情。每次单击加号按钮时,都会创建一个新模型,并且应用程序可以直观地正确表示它。但是,磁盘存储没有写一件事。

当用户退出应用程序时,Xcode的默认Core Data应用程序模板将保存(将数据内容写入存储),使任何数据更改成为永久性的。在此之前,任何变化只会影响记忆中​​的内容。