Iphone:在核心数据中插入对象时出错

时间:2010-10-12 13:07:33

标签: iphone cocoa-touch xcode core-data

我有一个Uitableview,可以从解析的xml提要中加载数据。当首次解析订阅源时,所有文本数据都存储在核心数据中的实体NewsItems中。在加载表之后,异步获取与每个对象相关联的图像,并将其存储在单独的实体NewsImages中,在本地存储订阅源/图像之后,下次应用程序启动时将在本地获取所有数据。 NewsItems和NewsImages彼此之间存在一对一的关系。

我有一个刷新按钮,当点击它时删除NewsItems中的所有条目,这也将删除与NewsItems中的对象相关联的NewsImages中的所有对象,因为关系删除规则是级联的。删除后,将再次解析Feed,并再次将数据存储在本地。

我的问题是当我快速多次这样做时。在本地保存图像时出现此错误。

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unacceptable type of value for to-one relationship: property = "ItemImage"; desired type = NewsImages; given type = NewsImages; value = <NewsImages: 0x68c49f0> (entity: NewsImages; id: 0x6804730 <x-coredata:///NewsImages/t5444BEE7-6193-4C25-8AAB-F64113BEAB7546> ; data: {
    Image = <ffd8ffe0 00104a46 49460001 01000001 00010000 ffe10058 45786966 00004d4d 002a0000 00080002 01120003 00000001 0001>;
    ImageItem = nil;
}).'

这是负责插入图像的功能

-(void)setImage:(UIImage*)moImage ForObject:(NSManagedObjectID*)moID{
    NewsItems *newsItem = (NewsItems*)[self.managedObjectContext objectWithID:moID];
    NewsImages *newsImage = (NewsImages*)[NSEntityDescription insertNewObjectForEntityForName:@"NewsImages" inManagedObjectContext:self.managedObjectContext];
    newsImage.Image = UIImageJPEGRepresentation(moImage,1.0);
    newsItem.ItemImage = newsImage;
    [self commitSave];
}

2 个答案:

答案 0 :(得分:0)

我认为最可能的问题是您在NewsImages以及此行中传递NewsItems对象的objectID而不是for setImage:ForObject:对象:

NewsItems *newsItem = (NewsItems*)[self.managedObjectContext objectWithID:moID];

...您实际上正在将NewsImages对象作为NewsItems返回。

在Objective-C中,Cast可能会出现问题,因为如果您向对象发送不理解的消息,则该对象不会在返回时进行投诉。由于强制转换,编译器不会捕获错误。

我会删除演员,将返回项设置为id,如下所示:

id newsItem =(NewsItems *)[self.managedObjectContext objectWithID:moID];

...然后记录它的类:

NSLog(@"class=%@",[newItem class]);

...或者在调试器中检查它。由于您似乎使用自定义NSManagedObject子类,因此应确认错误的来源。

答案 1 :(得分:0)

我遇到了同样的问题 我通过在实体编辑器中为派生类提供一个类来修复它。

以下设置产生了您所描述的错误:

Entity name : Contact <-------- User  
ObjC Class       : Contact           Default to NSManagedObject.

以下设置修复了它:

Entity name : Contact <-------- User  
ObjC Class  : Contact           Contact