托管对象何时实际保存?

时间:2013-12-28 07:03:53

标签: ios objective-c core-data

我有一些代码,我通过执行以下操作生成新的CoreData实体:

SOModule* newModule = [NSEntityDescription insertNewObjectForEntityForName:@"SOModule" inManagedObjectContext:self.managedObjectContext];
        newModule.name = self.tf_name.text;
        newModule.ip = self.tf_ip.text;
        newModule.port = self.tf_port.text;
        newModule.user = self.tf_user.text;
        newModule.password = self.tf_pass.text;
        newModule.created = [NSDate date];

然后我调用此获取请求来检查重复的属性:

 NSFetchRequest* fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"SOModule"];
          fetchRequest.predicate = [NSPredicate predicateWithFormat:@"ip == %@",newModule.ip];
          NSArray* matchingModules = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil];
          NSLog(@"%@",[matchingModules description]);

这是在我保存“保存”实体之前,但是我正在使用第一个代码块获取我刚刚输入的信息的数组描述。为了在最后保存它,我执行以下操作:

 [self.managedObjectContext save:nil];

我感觉newModule正在第一行代码中保存,但它不应该,因为它只是一个初始化器。任何清晰度都会很棒!

1 个答案:

答案 0 :(得分:1)

insertNewObjectForEntityForName:创建对象并将其插入到托管对象上下文中。

[self.managedObjectContext save:nil]

将上下文中的所有更改(例如新创建的对象)保存到持久性存储(SQLite文件)。

默认情况下,获取请求还包括未保存的更改,这就是它在保存上下文之前返回新对象的原因。

您可以通过设置

排除未保存的更改
[request setIncludesPendingChanges:NO];

但默认值为YES