2010-10-22 90 views
1

我已經包含了處理所有保存功能的函數。即使驗證失敗,核心數據也會保存對象

這是我的問題。

我抓取5個輸入值並將其保存爲CoreData Log Entity。

即使Log對象無法驗證,當我退出表單並查看錶視圖時仍然保存它。

如何強制Core Data在驗證後僅保存對象?

-(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;  




} 

回答

2

這有點晚了,但我剛剛看到你的問題,所以我想你扔一個答案。您添加到託管對象上下文的任何對象將在您下次保存時保存。你可以保留你的代碼,只需要用[managedObjectContext deleteObject:self.log]刪除這個新對象,但是更好的方法如下。

您的代碼:

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

創建新Log實例,並插入到被管理對象上下文。你想要做的是:

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

這將創建一個新的「日誌」實例尚未插入到MOC中。如果驗證成功,則在保存MOC之前插入self.log,如下所示:

[managedObjectContext insertObject:self.log]; 

然後保存。如果驗證失敗,請不要插入對象,並且您可以輕鬆前往。

+0

'initWithEntity'是iOS 6.1中的一個實例方法(不是所示的類方法),至少 – gmarik 2013-03-09 20:22:11

+0

是的,錯過了alloc。修復了答案。謝謝。 – XJones 2013-03-09 20:33:18

相關問題