0

我对 Core Data 和 Objective-c 还是很陌生。我一直在上下核心数据文档,不知道我在这里做错了什么。

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

我已经包括了“createItem”方法是创建和存储 RoomItem,以防我在那里做错了什么:

- (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;
}

具有关系的数据模型: 在此处输入图像描述

关系图: 在此处输入图像描述

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

谢谢!

4

2 回答 2

3

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

  • 在模型图像中,reports是从ReportItem到的关系RoomItem
  • 您的代码将其视为从RoomItemto的关系ReportItem

如果后者是您想要的,那么您必须在 Core Data 模型编辑器中正确命名关系:reports作为关系 onRoomItemroomReportsFor作为逆关系 on ReportItem

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

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

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

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


这是我认为关系应该如下所示的简化版本:

在此处输入图像描述

  • reports: from RoomItemto ReportItem (to-many 关系),
  • room:从ReportItemRoomItem(一对一关系,倒数reports)。
于 2012-12-16T10:57:04.983 回答
1

我在更新 Core Data 模型时也遇到过这种情况。在某些情况下,模拟器似乎保留了旧模型。这通常可以通过从模拟器中删除应用程序并清理/构建来解决。

于 2012-12-16T00:04:37.450 回答