ios - 核心数据实体中的托管对象导致 "is not key value coding-compliant for key"错误

标签 ios core-data entity-relationship nsmanagedobject

我对 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 文件在这里:

房间元素.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

房间元素.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;
}

具有关系的数据模型: enter image description here

关系图: enter image description here

如有任何关于解决此问题的建议,我们将不胜感激。如果有任何我未能包含的内容可能有帮助,请告诉我。

谢谢!

最佳答案

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

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

如果后者是你想要的,那么你必须在 Core Data 模型编辑器中正确命名关系:reports as a relationship on RoomItem and roomReportsFor 作为 ReportItem 的反向关系。

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

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

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

(只是为了完整起见:还有其他工具可以创建托管对象子类,例如有人推荐的 mogenerator 。)


这是我认为关系应该是什么样子的简化版本:

enter image description here

  • reports:从RoomItemReportItem(一对多关系),
  • room:从 ReportItemRoomItem(一对一关系,与 reports 相反)。<

关于ios - 核心数据实体中的托管对象导致 "is not key value coding-compliant for key"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13897348/

相关文章:

ios - 命名要提交的 iOS 应用程序

ios - 在我的服务器上上传100多张图像时收到内存警告和应用程序崩溃

c# - Entity Framework 中的派生类型

database - Oracle 表中的空白字段(即列)是否还会占用磁盘空间?

objective-c - 是否有任何私有(private) api 来监控 iPhone 上的网络流量?

iphone - UIPickerView 和 UITableView subview : problem with scroll after new data given

swift - 使用获取请求结果数组和结构设置 UITableView 部分和行的问题

ios - 在 performBlock 中多次保存上下文

ios - 为订购应用程序设置核心数据关系

java - 在微服务架构中管理与 MongoDb 的关系