核心数据:未保存
我无法保存到一个变量letsMeet.startTimeLabel。然而,在选择NSLog显示正确的值后,我保存到另一个变量(letsMeet.endTimeLabel)后,letsMeet.startTimeLabel变为(NULL)。下面是代码:核心数据:未保存
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
letsMeet = (LetsMeet *) [NSEntityDescription insertNewObjectForEntityForName:@"LetsMeet" inManagedObjectContext:managedObjectContext];
switch (actionSheet.tag)
{
case 1:
{
if (buttonIndex == 0)
{
UIDatePicker *startDatePicker = (UIDatePicker *)[actionSheet viewWithTag:kDatePickerTag1];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd"];
NSDate *selectedDate = [startDatePicker date];
NSDateFormatter *dayFormatter = [[NSDateFormatter alloc] init];
[dayFormatter setDateFormat:@"EEEE"];
NSDate *selectedDay= [startDatePicker date];
NSDateFormatter *monthFormatter = [[NSDateFormatter alloc] init];
[monthFormatter setDateFormat:@"MMMM"];
NSDate *selectedMonth = [startDatePicker date];
NSString *date = [[NSString alloc] initWithFormat:@"%@", [dateFormatter stringFromDate:selectedDate]];
DateLabel.text = date;
[letsMeet setDateLabel:date];
NSString *month = [[NSString alloc] initWithFormat:@"%@", [dayFormatter stringFromDate:selectedMonth]];
MonthLabel.text = month;
[letsMeet setMonthLabel:month];
NSString *day = [[NSString alloc] initWithFormat:@"%@", [monthFormatter stringFromDate:selectedDay]];
DayLabel.text = day;
[letsMeet setDateLabel:day];
NSDateFormatter *timeFormatter = [[NSDateFormatter alloc] init];
[timeFormatter setDateFormat: @"h:mm a"];
NSDate *selectedStartTime = [startDatePicker date];
NSString *startTime = [[NSString alloc] initWithFormat:@"%@", [timeFormatter stringFromDate:selectedStartTime]];
StartTimeLabel.text = startTime;
[letsMeet setStartTimeLabel:startTime];
NSError *error = nil;
if (![managedObjectContext save:&error]){
NSLog(@"Error Saving");
}
}
NSLog (@"This is the StartTime after selecting %@", letsMeet.startTimeLabel);
}
break;
case 2:
{
if (buttonIndex == 0)
{
UIDatePicker *endTimePicker = (UIDatePicker *)[actionSheet viewWithTag:kDatePickerTag2];
NSDateFormatter *endTimeFormatter = [[NSDateFormatter alloc] init];
[endTimeFormatter setDateFormat: @"h:mm a"];
NSDate *endSelectedTime = [endTimePicker date];
NSString *endTime = [[NSString alloc] initWithFormat:@"%@", [endTimeFormatter stringFromDate:endSelectedTime]];
EndTimeLabel.text = endTime;
[letsMeet setEndTimeLabel:endTime];
NSLog (@"This is the EndTime %@", letsMeet.endTimeLabel);
NSLog (@"This is the StartTime after selecting BOTH %@", letsMeet.startTimeLabel);
}
else if (buttonIndex == 1)
{
EndTimeLabel.text = @"Whenever";
[letsMeet setEndTimeLabel:EndTimeLabel.text];
}
NSError *error = nil;
if (![managedObjectContext save:&error]) {
}
}break;
// Handle the error.
}
}
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
UIViewController *destinationViewController = segue.destinationViewController;
NSLog (@"Prepare For Segue StartTime %@", letsMeet.startTimeLabel);
NSLog (@"Prepare For Segue EndTime%@", letsMeet.endTimeLabel);
}
这里是日志:
2013-02-20 21:38:24.253 AppointmentTime[3129:c07] This is the StartTime after selecting 9:30 AM
2013-02-20 21:38:32.325 AppointmentTime[3129:c07] This is the EndTime 12:15 PM
2013-02-20 21:38:32.325 AppointmentTime[3129:c07] This is the StartTime after Selecting BOTH (null)
2013-02-20 21:38:34.069 AppointmentTime[3129:c07] Prepare For Segue StartTime (null)
2013-02-20 21:38:34.069 AppointmentTime[3129:c07] Prepare For Segue EndTime12:15 PM
问:为什么会letsMeet.startTimeLabel显示纠正第一次选择结束时间之后,它改变为NULL。请注意EndTime继续显示正确的值,直到prepareForSegue。奇怪的!
根据您的日志和代码,您正在输入切换块两次。这意味着您要输入两次actionSheet:clickedButtonAtIndex:
方法。所以每次你输入方法
letsMeet = (LetsMeet *) [NSEntityDescription insertNewObjectForEntityForName:@"LetsMeet" inManagedObjectContext:managedObjectContext];
语句被执行两次,依次创建两个对象。您可以通过从商店获取进行查看。
所以你检查两个不同的对象,因此null
属性。
如果您只使用一个管理对象,则可能在执行insertNewObjectForEntityForName:inManagedObjectContext:
之前为对象添加nil
检查。这将确保您使用的是同一个对象。
如果您同时使用多个对象,请使用对象ID或某个唯一键来标识对象并对其进行操作。
编辑:
您可以检查与下面的代码零:
if(letsMeet==Nil){
letsMeet = (LetsMeet *) [NSEntityDescription insertNewObjectForEntityForName:@"LetsMeet" inManagedObjectContext:managedObjectContext];
}
这只会工作,如果对象您所呼叫的actionSheet:clickedButtonAtIndex:
方法始终是在内存中。但是,由于您坚持不懈,您可能需要从商店获取对象,然后检查否。的物体。
NSError *error;
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"LetsMeet" inManagedObjectContext:managedObjectContext]];
NSArray *objectArray = [managedObjectContext executeFetchRequest:request error:&error]
if(objectArray.count==0){
letsMeet = (LetsMeet *) [NSEntityDescription insertNewObjectForEntityForName:@"LetsMeet" inManagedObjectContext:managedObjectContext];
}else{
letsMeet = (LetsMeet *)[objectArray objectAtIndex:0];
}
注:如果你需要坚持只有一对夫妇的变量,核心数据可能是矫枉过正。改为使用NSUserDefaults,并保持简单。
谢谢你的回复。我只使用一个managedObject。你能给我一个关于如何检查nil的例子,以确保我使用的是同一个managedObject,并在哪里放置它? – user1107173 2013-02-21 06:45:10
只需创建一次对象。我已经更新了我的答案。 – Rakesh 2013-02-21 06:58:26
我试图检查零,但它不起作用。我做了一个NSLog中,如果语句,它永远不会被执行。 StartLog和EndTime的NSLog都显示为NULL。 然后我尝试了您的提取代码。同样的事情发生。 NSLog里面的if语句也永远不会被执行。 不确定为什么它跳过if语句。我甚至尝试在ViewDidLoad中移动这两个代码并得到相同的结果。我应该尝试使用ObjectID吗?我不知道如何获得唯一的ObjectID。谢谢 – user1107173 2013-02-22 16:59:28
因为它们是不同的实例。 – Rog 2013-02-21 05:29:05
你是什么意思? 我也为PrepareForSegue中的两个变量做了NSLog,并且StartTime显示为NULL,而EndTime显示正确的值。我更新了代码和日志。 – user1107173 2013-02-21 05:40:37