即使validation失败,核心数据也会保存对象

我已经包含了处理所有保存function的函数。

这是我的问题。

我抓取5个input值并将其保存为CoreData Log Entity。

即使在Log对象无法validation的情况下,当我退出表单并查看表视图时,它仍然正在保存。

如何强制核心数据只保存对象一旦validation?

-(void) saveLog { NSManagedObjectContext *managedObjectContext = [(AppDelegate_Shared *)[[UIApplication sharedApplication] delegate] managedObjectContext]; FormPickerCell *bloodPressure = (FormPickerCell *) [self.formController fieldAsObject:@"bloodpressure"]; NSInteger systolic = [(PressureDataSource*)bloodPressure.pickerCellDelegate selectedSystolicPressureForFormPickerCell:bloodPressure]; NSInteger diastolic = [(PressureDataSource*)bloodPressure.pickerCellDelegate selectedDiastolicPressureForFormPickerCell:bloodPressure]; NSLog(@"bp is %d / %d", systolic, diastolic); NSLog(@"date is %@", [self.formController valueForField:@"date"]); NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss ZZZ"]; if (self.isNewLog && !self.validationHasFailed) { self.log = [NSEntityDescription insertNewObjectForEntityForName:@"Log" inManagedObjectContext:managedObjectContext]; } NSString *heartRate = [[self.formController valueForField:@"heartrate"] stringByReplacingOccurrencesOfString:@" bpm" withString:@""]; NSNumberFormatter * f = [[NSNumberFormatter alloc] init]; [f setNumberStyle:NSNumberFormatterDecimalStyle]; self.log.created = [NSDate date]; self.log.notes = [self.formController valueForField:@"notes"]; self.log.systolic = [NSNumber numberWithInteger:systolic]; self.log.diastolic = [NSNumber numberWithInteger:diastolic]; self.log.stressLevel = [self.formController valueForField:@"stresslevel"]; self.log.logDate = [dateFormatter dateFromString:[self.formController valueForField:@"date"]]; self.log.heartrate = [f numberFromString:heartRate]; NSLog(@"Log date is %@",[self.formController valueForField:@"date"]); [f release]; NSError *error; NSString *title; NSString *growlDescription; if ([self.log validateForInsert:&error]){ NSLog(@"after validation returned true"); if(![managedObjectContext save:&error]) { NSLog(@"Unresolved error"); title = @"Error Occurred"; growlDescription = [error localizedDescription]; self.validationHasFailed = YES; } else { title = @"Log Saved!"; growlDescription = @"Log saved successfully"; [self.navigationController popViewControllerAnimated:YES]; } } else { NSLog(@"after validation returned false"); NSLog(@"Unresolved error"); title = @"Error Occurred"; growlDescription = [error localizedDescription]; self.validationHasFailed = YES; } IZGrowlNotification *notification = [[IZGrowlNotification alloc] initWithTitle:title description:growlDescription image:nil context:nil delegate:self]; [[IZGrowlManager sharedManager] postNotification:notification]; [notification release]; error = nil; } 

这有点晚了,但我刚刚看到你的问题,所以我想扔你一个答案。 您添加到托pipe对象上下文的任何对象将在下一次保存时保存。 你可以保留你的代码,只需用[managedObjectContext deleteObject:self.log]删除新的对象,但更好的方法如下。

你的代码:

 self.log = [NSEntityDescription insertNewObjectForEntityForName:@"Log" inManagedObjectContext:managedObjectContext]; 

创build一个新的Log实例并插入到托pipe对象上下文中。 你想要做的是:

 self.log = [[Log alloc] initWithEntity:[NSEntityDescription entityForName:@"Log" inManagedObjectContext:managedObjectContext] insertIntoManagedObjectContext:nil]; 

这将创build一个尚未插入到MOC中的新“日志”实例。 如果validation成功,则在保存MOC之前插入self.log,如下所示:

 [managedObjectContext insertObject:self.log]; 

然后你保存。 如果validation失败,不要插入对象,你很好。