Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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 - Fatal编程技术网

Core data 在核心数据收集中添加新数据后,它可以';无法保存(发生多次验证错误)

Core data 在核心数据收集中添加新数据后,它可以';无法保存(发生多次验证错误),core-data,Core Data,下面的代码添加到核心数据问题,但添加后,我无法保存错误(发生多次验证错误) 不幸的是,我不能用你下面建议的方法修复一个bug。 Bcs实体目标列表必须通过项目理解与实体载体建立关系。 这就是我试图修复它的方式: [objectDestinationList setValue:objectCarrier forKey:@"carrier"]; 我被发送到方法我的载体对象作为对象,但它不工作 在这种情况下,我不知道如何解决它。Bcs我看到了错误,但不明白为什么错误是开始的 你知道一个简单的代码来纠

下面的代码添加到核心数据问题,但添加后,我无法保存错误(发生多次验证错误)

不幸的是,我不能用你下面建议的方法修复一个bug。 Bcs实体目标列表必须通过项目理解与实体载体建立关系。 这就是我试图修复它的方式:

[objectDestinationList setValue:objectCarrier forKey:@"carrier"];
我被发送到方法我的载体对象作为对象,但它不工作

在这种情况下,我不知道如何解决它。Bcs我看到了错误,但不明白为什么错误是开始的

你知道一个简单的代码来纠正添加关系到实体吗?我在互联网上看到的只是一本核心数据书,我的马库斯·扎拉(Marcus Zarra)和他那个很难理解的例子。他展示了一个复杂的解决方案,我能理解,但使用编程风格,这对我来说并不容易(根据我一个月的cocoa编程经验;)

以下是附加信息:如何创建Carrier实例。我有managedObjectContext,我从AppDelegate接收到它

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request setEntity:[NSEntityDescription entityForName:@"Carrier"
                              inManagedObjectContext:managedObjectContext]];
NSManagedObject *carrier = [managedObjectContext executeFetchRequest:request error:&error]
同样,我为DestinationsList实体准备NSManagedObject

在为destinationsList将所有值添加到NSManagedObject之后,我必须建立Carrer NSManagedObject和destinationsList之间的关系。在这种情况下,我遇到了麻烦。下面是我如何尝试更新运营商实体的关系:

    NSSet *newDestSet = [NSSet setWithObjects:objectDestination,nil];
    [objectCarrier setValue:newDestSet forKey:@"destinationsList"];
最后,我将2010-11-03 21:22:56.968 snow[20301:a0f]-[NSCFArray initialize]:未识别的选择器发送到实例0x1c44e40

下面是我的类接口说明:

  @interface InitUpdateIXC : NSObject {

NSInteger destinationType;
}

-(void) updateCarrierList:(NSManagedObjectContext       *)managedObjectContext;
-(void)updateDestinationList:(NSManagedObjectContext *)managedObjectContext 
              forCarrier:(NSString *)carrierName 
        forCarrierObject:(NSManagedObject *)objectCarrier 
         destinationType:(NSInteger)destinationType;
@end
是的,下面的回答给出了正确的模型,但这里有些不同。 首先,对于实体,我并没有单独的类,正如您的模型中存在的那个样。我现在的课程就是NSManagedObject 在第二种情况下,关系“carrier”对于实体DestinationsList是非可选的

解决方案和错误描述:

如果出现问题,我的代码会发生什么情况: 当我尝试将setValue forKey与DestinationsList的back关系添加到Carrier时,我忘记了NSManagementObject每次都返回数组,而不仅仅是对象。 这就是我收到关于数组初始化问题的错误消息的原因

解决方案不是将载体对象发送到方法,bcs对于我来说太难从数组中提取正确的对象,而没有键值。我使用谓词访问将对象提取到数组,使用lastObject函数从数组中提取正确的对象。在那之后,我设置了accroding值,一切正常。 一个解决方案看起来不像可可风格,所以更好的方法是在将来重构它,任何建议都会来的。 以下是适当的代码:

    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
    [request setEntity:[NSEntityDescription entityForName:@"Carrier"
                                   inManagedObjectContext:managedObjectContext]];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name =%@",carrierName];
    [request setPredicate:predicate];
    NSError *error = nil; 
    NSArray *currentCarriers = [managedObjectContext executeFetchRequest:request error:&error];
    [objectDestination setValue:[currentCarriers lastObject] forKey:@"carrier"];

尝试为“保存”添加类似的内容

    NSError *error = nil;
    if (![managedObjectContext save:&error])
        { 
        // Handle the error. 
        NSLog(@"Failed to save to data store: %@", [error localizedDescription]);
        NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
        if(detailedErrors != nil && [detailedErrors count] > 0)
            {
            for(NSError* detailedError in detailedErrors)
                {
                NSLog(@"  DetailedError: %@", [detailedError userInfo]);
                }
            }
        else
            {
            NSLog(@"  %@", [error userInfo]);
            }
        }
至少,您可以看到多个错误是什么。如果你发布这些信息,可能会有人提供更多帮助

不过,有一种想法是,您的数据模型存在一些缺陷,比如没有值的非可选属性,等等

如果您创建了NSManagedObject子类Carrier和DestinationsList,那么在Carrier.h中应该有如下方法声明。(假设多个目的地列表的承运人称为“目的地列表”。)

声明这些内容后,您应该能够使用以下行将DestinationsList添加到承运商:

[myCarrier addDestinationsListsObject:myDestinationsList];
由于没有看到完整的数据模型,很难知道发生了什么以及什么有助于修复它

您的模型定义中是否有类似的内容


非常感谢。NSLocalizedDescription=“承运人是必需的值。”。看起来,当我添加具有反向关系的实体时,我也必须添加它。这对我来说是非可选的,以保护我在核心数据存储中未使用的数据。如果我有名为carrier的关系,如果我在实体carrier中有name属性,我如何从代码连接它?当我将对象carrier添加到关系时,我看到保存时的最后一个错误:2-[NSAlert WitherRor:]调用为nil NSError。将显示一条通用错误消息,但用户应该得到更好的结果。操作无法完成。没有关于此问题的其他信息。但在这段时间里,我没有看到任何问题,核心数据也保存在数据库中。请尝试在.xcdatamodel中将“carrier”关系(或属性)设置为“Optional”。这应该解决“承运人是必需值”错误。如果这确实“修复”了bug,那么在保存之前,您需要返回并修改代码以设置所有对象的“载体”。当然,在这一点上,您也应该将carrier恢复为非可选(必需的)。我对您的数据模型了解不够,无法回答您的第二个问题。我不知道哪个实体有“承运人”关系。如果DestinationsList具有属性“carrier”,则应该具有如下内容:[theDestinationsList setCarrier:theCarrier]。如果关系定义了反向关系,则不必显式设置反向。换句话说,您不必这样做:[theCarrier addDestinationsListObject:theDestinationsList]。
@interface Carrier (CoreDataGeneratedAccessors)
- (void)addDestinationsListsObject:(Run *)destinationsList;
- (void)removeDestinationsListsObject:(Run *)destinationsList;
- (void)addDestinationsLists:(NSSet *)destinationsLists;
- (void)removeDestinationsLists:(NSSet *)destinationsLists;
@end
[myCarrier addDestinationsListsObject:myDestinationsList];