从CSV解析CSV CoreData无法保存错误1570 nil对象

时间:2014-11-04 01:13:25

标签: ios objective-c core-data

我对目标c和iOS都很陌生,非常感谢这里的一些帮助。 我一直在撞墙试图让这个工作,但不断得到错误:

Failed to save to data store: The operation couldn’t be completed. (Cocoa error 1570.)

我正在做的是导入CSV文件。

据我所知,这部分有效。正确地解析了CSV,我得到了所有正确的值,并且我已经通过我可以告诉KA对象获得正确的值进行了调试。

但是我的关系似乎有些不对劲 - 1570问题来自nil newTrainingDay所需的日期字段(这似乎是在我调试时填充的)。我有一种感觉还有别的错,但我不确定是什么......

有谁能告诉我这里我做错了什么?

1 个答案:

答案 0 :(得分:1)

我认为问题源于创建新对象并将其插入数据库,然后搜索是否存在满足您需求的现有对象。拿这个代码,例如:

 // look for existing day
    KATrainingDay *newTrainingDay = [NSEntityDescription insertNewObjectForEntityForName:@"KATrainingDay" inManagedObjectContext:self.managedObjectContext];
    // Fetching
    fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"KATrainingDay"];
    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"date == %@", date]];
    // Execute Fetch Request
    fetchError = nil;
    NSArray *trainingDays = [self.managedObjectContext executeFetchRequest:fetchRequest error:&fetchError];
    // if you found it
    if (!fetchError) {
        if ([trainingDays count]) {
            for (KATrainingDay *day in trainingDays) {
                newTrainingDay = day;
            }
        } else {
            // set name and date for training day
            newTrainingDay.date = date;
            newTrainingDay.name = trainingDayNameString;
            [newTrainingDay addRoutinesObject:newTrainingRoutine];
            [newTrainingRoutine addTrainingDaysObject:newTrainingDay];
        }

首先在您的上下文中创建并插入KATrainingDay,然后进行抓取以查找具有正确日期的KATrainingDay。如果找到它,则将指针(newTrainingDay)分配给刚刚获取的对象。 但是你刚刚插入的对象仍然在上下文中(虽然你不再有指向它的指针)并且它的所有属性和关系都有nil值。因此当你保存时,那个对象就失败了所需日限制。

要解决此问题,请仅在找不到与fetch匹配时插入新对象:

 // look for existing day
    KATrainingDay *newTrainingDay;
    // Fetching
    fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"KATrainingDay"];
    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"date == %@", date]];
    // Execute Fetch Request
    fetchError = nil;
    NSArray *trainingDays = [self.managedObjectContext executeFetchRequest:fetchRequest error:&fetchError];
    // if you found it
    if (!fetchError) {
        if ([trainingDays count]) {
            for (KATrainingDay *day in trainingDays) {
                newTrainingDay = day;
            }
        } else {
            // set name and date for training day
            newTrainingDay = [NSEntityDescription insertNewObjectForEntityForName:@"KATrainingDay" inManagedObjectContext:self.managedObjectContext]
            newTrainingDay.date = date;
            newTrainingDay.name = trainingDayNameString;
        } 
        [newTrainingDay addRoutinesObject:newTrainingRoutine];

(同样适用于其他实体)。在上面我已经将addRoutinesObject:调用移到了else块之外,所以无论你找到现有的还是创建new(我假设你想要的)它都会执行。请注意,您不需要设置关系的两侧 - 如果您设置一侧,CoreData会自动为您执行另一侧(假设它们被定义为反转)。另外一个提示,你不需要你的for循环来获取数组中的最后一项,你可以使用:

newTrainingDay = [trainingDays lastObject];