我对Core Data和Objective-C还是很陌生。我上过Core Data文档,不知道我在做什么错。

在运行时,将NSManagedObject“ ReportItem”添加到NSManagedObject“ RoomItem”中的NSMutableSet“报告”时,出现以下错误: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;
}


具有关系的数据模型:


关系图:


任何解决此问题的建议将不胜感激。请让我知道是否有任何我不能包括的内容可能有所帮助。

谢谢!

最佳答案

图像中显示的核心数据模型与代码之间存在差异。


在模型图像中,reports是从ReportItemRoomItem的关系。
您的代码将其视为从RoomItemReportItem的关系。


如果要使用后者,则必须在Core Data模型编辑器中正确命名关系:reports作为RoomItem上的关系,而roomReportsFor作为ReportItem上的逆向关系。

我也强烈建议您不要自己编写托管对象子类文件,而是让它由Xcode生成:在Core Data模型编辑器中选择实体,然后从菜单中选择“编辑器->创建NSManagedObject子类...”。 。

您的“ RoomItem.h”文件中存在另一个错误:多个关系的数据类型为NSSet,而不是NSMutableSet

使用Xcode创建的托管对象子类文件有助于避免此类不一致和错误。您只需要记住在更改核心数据模型后重新创建文件。

(仅出于完整性考虑:还有其他一些工具可以创建托管对象子类,例如有人建议的mogenerator。)



这是我认为关系应为的简化版本:




reports:从RoomItemReportItem(多对多关系),
room:从ReportItemRoomItem(一对一关系,reports的倒数)。

关于ios - 核心数据实体中的托管对象导致“ key 不符合 key 值编码”错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13897348/

10-10 20:39