Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Core data 核心数据:不保存_Core Data_Nsmanagedobjectcontext_Save - Fatal编程技术网

Core data 核心数据:不保存

Core data 核心数据:不保存,core-data,nsmanagedobjectcontext,save,Core Data,Nsmanagedobjectcontext,Save,保存到一个变量letsMeet.startTimeLabel时遇到问题。选择NSLog后立即显示正确的值,但是,在保存到另一个变量(letsMeet.endTimeLabel)后,letsMeet.startTimeLabel将更改为(NULL)。代码如下: - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { letsMeet = (LetsMeet *) [

保存到一个变量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在第一次显示时是正确的,而在选择EndTime后,它会变为NULL。请注意,在prepareForSegue之前,EndTime始终显示正确的值。奇怪

根据您的日志和代码,您将进入开关块两次。这意味着您要输入两次
操作表:ClickedButtonIndex:
方法。所以每次你输入这个方法

letsMeet = (LetsMeet *) [NSEntityDescription insertNewObjectForEntityForName:@"LetsMeet" inManagedObjectContext:managedObjectContext];
语句执行两次,然后创建两个对象。你可以通过从商店取货看到这一点

因此,您正在检查两个不同对象中的属性,从而检查
null

如果只使用一个托管对象,则在执行
insertNewObjectForEntityForName:inManagedObjectContext:
之前,可能可以为该对象添加一个
nil
检查。这将确保您使用的是相同的对象
如果同时使用多个对象,请使用对象id或某个唯一键来标识对象并对其进行操作

编辑:
您可以使用以下代码检查nil:

if(letsMeet==Nil){
    letsMeet = (LetsMeet *) [NSEntityDescription insertNewObjectForEntityForName:@"LetsMeet" inManagedObjectContext:managedObjectContext];
}
只有在调用
actionSheet:ClickedButtonIndex:
方法的对象始终在内存中时,这才有效。但是,由于您正在持久化,您可能需要从存储中获取对象,然后检查对象的数量

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并保持简单。

因为它们是不同的实例。您的意思是什么?我也在PrepareForSegue中为这两个变量做了NSLog,StartTime显示为NULL,而EndTime显示为正确的值。我更新了代码和日志。谢谢你的回复。我只使用了一个managedObject。你能给我举个例子,说明如何检查nil,以确保我使用的是同一个managedObject,我应该把它放在哪里?我试图检查nil,但它不起作用。我在if语句中做了一个NSLog,但它从未执行过。StartTime和EndTime的NSLog都显示为空。然后我尝试了你的获取代码。同样的事情也发生了。if语句中的NSLog也永远不会执行。不知道为什么会跳过if语句。我甚至试着在ViewDidLoad中移动这两个代码,得到了相同的结果。我应该尝试使用ObjectID吗?我不知道如何获得唯一的ObjectID。ThanksI还尝试仅将以下行移动到ViewDidLoad:letsMeet=(letsMeet*)[NSEntityDescription insertNewObjectForEntityForName:@“letsMeet”inManagedObjectContext:managedObjectContext];我得到了以下日志:2013-02-22 09:01:14.632任命时间[3140:c07]这是选择9:01 AM 2013-02-22 09:01:18.409任命时间[3140:c07]这是结束时间2013-02-22 09:01:18.410任命时间[3140:c07]这是选择两者后的开始时间(空)对不起。提供的解决方案中有一个错误。。不是莱斯米特=无但是letsMeet==零。如果变量为nil,则仅创建对象。我将更新答案。在fetch部分,如果它没有“if”块,则表示对象数组计数不是零。所以你已经有了一个对象。所以用那个物体。再次更新答案。