2010-10-22 2 views
1

Я включил функцию, которая обрабатывает все функциональные возможности сохранения.Основные данные сохраняют объект даже при неудачной проверке

Вот моя проблема.

Я захватываю 5 значений ввода и сохраняю их как объект журнала CoreData.

Даже если объект журнала не может быть проверен, он все равно сохраняется, когда я возвращаюсь из формы и смотрю на представление таблицы.

Как заставить данные ядра сохранять объект только после его проверки?

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

Это создаст новый экземпляр «Log», который еще не был вставлен в МОС. Если проверка прошла успешно, перед сохранением MOC вставки self.log следующим образом:

[managedObjectContext insertObject:self.log]; 

Тогда вы сохраните. Если проверка не удалась, не вставляйте объект, и вам хорошо идти.

+0

'initWithEntity' - это метод экземпляра (не метод класса, как показано) в iOS 6.1, по крайней мере, – gmarik

+0

да, пропустили выделение. исправил ответ. спасибо. – XJones

Смежные вопросы