gpt4 book ai didi

iphone - 即使验证失败,Core Data 也会保存对象

转载 作者:行者123 更新时间:2023-11-29 11:24:25 25 4
gpt4 key购买 nike

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

这是我的问题。

我正在抓取 5 个输入值并将其保存为 CoreData 日志实体。

即使当 Log 对象验证失败时,当我退出表单并查看 TableView 时它仍然被保存。

如何强制 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;




}

最佳答案

这有点晚了,但我刚看到你的问题,所以我想我会给你一个答案。下次保存时,您添加到托管对象上下文中的任何对象都将被保存。您可以保持代码不变,只需使用 [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];

然后你保存。如果验证失败,请不要插入该对象,一切顺利。

关于iphone - 即使验证失败,Core Data 也会保存对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4000679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com