2010-11-01 68 views
2

下面的代码添加到核心数据问题中,但添加后,我无法保存,出现错误(乘法验证错误发生)我在核心数据收集中添加新数据后,无法保存(乘法验证错误发生)

MySQLIXC *ixcDatabase = [[MySQLIXC alloc] init]; 
NSArray *destinationsForSaleList = [ixcDatabase destinationsForSaleList:carrier]; 
NSFetchRequest *request1 = [[[NSFetchRequest alloc] init] autorelease]; 
[request1 setEntity:[NSEntityDescription entityForName:@"DestinationsList" 
inManagedObjectContext:managedObjectContext]]; 
for (NSDictionary *destinationsForSale in destinationsForSaleList) { 

    NSManagedObject *object1 = [NSEntityDescription 
           insertNewObjectForEntityForName:@"DestinationsList" 
           inManagedObjectContext:managedObjectContext]; 

    NSLog(@"Moc: %@",managedObjectContext); 

    [object1 setValue:@"y" forKey:@"weAreSoldIt"]; 
    // changeDate   
    NSString *chdate = [destinationsForSale objectForKey:@"chdate"]; 
    NSDateFormatter *changeDate = [[[NSDateFormatter alloc] init] autorelease]; 
    [object1 setValue:[changeDate dateFromString:chdate] forKey:@"changeDate"]; 
    NSLog(@"Carrier :%@ Destination name:%@",carrier, destinationsForSale); 

    //Country 
    [object1 setValue:[destinationsForSale objectForKey:@"country"] forKey:@"country"]; 

    //rate 
    NSNumberFormatter *rate = [[[NSNumberFormatter alloc]init ]autorelease]; 
    [object1 setValue:[rate numberFromString:[destinationsForSale objectForKey:@"price"]] forKey:@"rate"]; 

不幸的是,我不能通过你建议的方式修复bug。 Bcs Entity DestinationList必须通过项目理解与Entity Carriers建立关系。 这就是我尝试修复它:

[objectDestinationList setValue:objectCarrier forKey:@"carrier"]; 

我送到我的方法载体对象为对象,但它不工作。

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

你知道一个简单的代码来纠正与实体的关系吗?所有我在互联网上捕捉到的都是一本核心数据手册,我的Marcus Zarra和他很难理解的例子。他展示了一个复杂的解决方案,我可以理解它,但是使用编程风格在这个时刻对我来说不是那么容易(根据我在可可编程方面的一个月的经验;)

这里是附加信息:我如何创建Carrier实例。我有ManageObjectContext,我从AppDelegate上课。

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
[request setEntity:[NSEntityDescription entityForName:@"Carrier" 
           inManagedObjectContext:managedObjectContext]]; 
NSManagedObject *carrier = [managedObjectContext executeFetchRequest:request error:&error] 

以同样的方式我准备NSManagedObject for DestinationsList实体。

之后,我添加所有值到NSManagedObject的destinationsList,我必须做Carrer NSManagedObject和destinationsList之间的关系。在这种情况下,我有麻烦。贝娄是我尝试更新运营商实体关系:

NSSet *newDestSet = [NSSet setWithObjects:objectDestination,nil]; 
    [objectCarrier setValue:newDestSet forKey:@"destinationsList"]; 

终于我有21 2010-11-03:22:56.968雪[20301:A0F] - [NSCFArray初始化]:无法识别的选择发送到实例0x1c44e40

贝娄是我的类接口deescription:

@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”对于Entity DestinationsList是非可选的。

解决方案与错误描述:

在故障情况下,有什么我的代码发生了: 当我尝试添加的setValue forKey从DestinationsList到托架放回关系,我忘了,NSManagmentObject返回每次阵列,而不仅仅是对象。 这是我收到有关阵列初始化问题的错误的原因。

解决方案不发送Carrier对象的方法,对于我来说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"]; 

回答

1

尝试增加这样的事情对你“保存”

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子类的运营商和DestinationsList,然后在Carrier.h你应该有一些像这样的方法声明。 (假设运营商对多DestinationsList被称为“destinationsLists”。)

@interface Carrier (CoreDataGeneratedAccessors) 
- (void)addDestinationsListsObject:(Run *)destinationsList; 
- (void)removeDestinationsListsObject:(Run *)destinationsList; 
- (void)addDestinationsLists:(NSSet *)destinationsLists; 
- (void)removeDestinationsLists:(NSSet *)destinationsLists; 
@end 

一旦这些声明,你应该能够到DestinationsList添加到载体具有这样一行:

[myCarrier addDestinationsListsObject:myDestinationsList]; 

没有看到您的完整数据模型,很难知道发生了什么以及哪些可以帮助解决问题。

对于您的模型定义,您是否有类似的内容?

alt text alt text alt text

+0

感谢ü非常。 NSLocalizedDescription =“载体是必需的值”。看起来像当我添加具有反比关系的实体时,我也必须添加它。对于我来说,这是非可选的,以保护我在核心数据存储中未使用的数据。 – Alex 2010-11-02 10:53:04

+0

如果我有关系命名承运人,如何我可以连接它从代码,如果我有实体承运人的名称属性? – Alex 2010-11-02 11:25:43

+0

当我将对象载体添加到关系中时,我在保存中看到了最终错误:2 - [NSAlert alertWithError:]用nil NSError调用。一般的错误信息会显示出来,但用户应该更好。操作无法完成。没有关于此问题的其他信息。但在这个时候,我没有看到任何麻烦,核心数据保存以及数据库。 – Alex 2010-11-02 14:54:44