我对核心数据很新,而且客观c。我一直在Core Data文档中上下,不知道我在这里做错了什么。
在运行时,我在NSManagedObject“RoomItem”中向NSMutableSet“reports”添加NSManagedObject“ReportItem”时出现以下错误:NSUnknownKeyException', reason: '[<RoomItem 0x747c850> valueForUndefinedKey:]: the entity RoomItem is not key value coding-compliant for the key "reports"
错误发生在下面“creatReportForRoom”方法中的“RoomList”商店类中,该方法在输入相关数据的UIViewController中的viewWillDisapear上调用:
- (ReportItem *)creatReportForRoom:(RoomItem *)currentRoom Report:(ReportItem *)report
{
NSDate *dateCreated = [NSDate date];
ReportItem *detailItem = [NSEntityDescription insertNewObjectForEntityForName:@"ReportItem" inManagedObjectContext:context];
[detailItem setDateReportCreated:dateCreated];
NSMutableSet *reports = [currentRoom mutableSetValueForKey:@"reports"];
[reports addObject:detailItem]; //error is occurring at this line
[allReports addObject:detailItem];
return detailItem;
}
“RoomItem”NSManagedObject文件位于:
RoomItem.h
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@interface RoomItem : NSManagedObject
@property (nonatomic, strong) NSString *building;
@property (nonatomic, strong) NSString *room;
@property (nonatomic, retain) NSString *imageKey;
@property (nonatomic, retain) UIImage *buildingImage;
@property (nonatomic, strong) UIImage *buildingThumbnail;
@property (nonatomic, strong) NSData *buildingThumbnailData;
@property (nonatomic) double objectIndex;
@property (nonatomic, strong) NSDate *dateCreated;
@property (nonatomic, retain) NSMutableSet *reports;
@end
RoomItem.m
#import "RoomItem.h"
@implementation RoomItem
@dynamic building, buildingThumbnail, buildingThumbnailData, objectIndex, room, dateCreated, imageKey, buildingImage, reports;
@end
我已经创建并存储了RoomItem的“createItem”方法,以防我在那里做错了:
- (RoomItem *)createItem
{
double order;
//create new roomItem
//tracks what number item it's creating
if ([allItems count] == 0) {
order = 1.0;
}
else
{
order = [[allItems lastObject] objectIndex] + 1;
}
NSLog(@"Adding after %d items, order = %.2f", [allItems count], order);
RoomItem *detailItem = [NSEntityDescription insertNewObjectForEntityForName:@"RoomItem"
inManagedObjectContext:context];
[detailItem setObjectIndex:order];
[detailItem setDateCreated:[NSDate date]];
[allItems addObject:detailItem];
return detailItem;
}
有关系的数据模型:
关系图:
任何有关解决此问题的建议都将受到极大的赞赏。如果我没有提供任何可能有帮助的内容,请告诉我。
谢谢!
答案 0 :(得分:3)
图片中显示的核心数据模型与您的代码之间存在差异。
reports
是从ReportItem
到RoomItem
的关系。RoomItem
到ReportItem
的关系。如果后者是您想要的,那么您必须正确命名Core Data模型编辑器中的关系:reports
作为RoomItem
和roomReportsFor
之间的关系作为反向关系在ReportItem
。
我也强烈建议您不要自己编写托管对象子类文件,而是让它由Xcode生成:在Core Data模型编辑器中选择实体,然后选择“Editor - &gt ;从菜单中创建NSManagedObject Subclass ...“。
“RoomItem.h”文件中还有另一个错误:多对多关系的数据类型为NSSet
,而不是NSMutableSet
。
使用Xcode创建的托管对象子类文件有助于避免此类不一致和错误。您只需记住在Core Data模型中更改后重新创建文件。
(仅为了完整性:还有其他工具可以创建托管对象子类,例如mogenerator,有些人建议这样做。)
这是我认为关系应该是这样的简化版本:
reports
:从RoomItem
到ReportItem
(与多人的关系),room
:从ReportItem
到RoomItem
(到一个关系,与reports
相反)。答案 1 :(得分:1)
我在更新Core Data模型时也遇到了这种情况。在某些情况下,似乎模拟器坚持旧模型。这通常可以通过从模拟器中删除应用程序并清理/构建来修复。