0

私はCoreDataにかなり慣れておらず、Objective-cです。私はCoreDataのドキュメントを上下に移動してきましたが、ここで何が間違っているのかわかりません。

実行時に、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ファイルは次のとおりです。

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

関係のあるデータモデル: ここに画像の説明を入力してください

関係図: ここに画像の説明を入力してください

この問題を修正するためのアドバイスをいただければ幸いです。私が含めなかったことが役立つかもしれない何かがあれば私に知らせてください。

ありがとう!

4

2 に答える 2

3

画像に表示されているコアデータモデルとコードの間に不一致があります。

  • モデル画像では、はからへreportsの関係です。ReportItemRoomItem
  • RoomItemあなたのコードはそれをからへの関係として扱いますReportItem

後者が必要な場合は、コアデータモデルエディタで関係に正しく名前を付ける必要がありますreports。の関係として、RoomItemおよびroomReportsForの逆の関係としてReportItem

また、管理対象オブジェクトのサブクラスファイルを自分で作成するのではなく、Xcodeで生成することを強くお勧めします。コアデータモデルエディターでエンティティを選択し、メニューから[エディター]->[NSManagedObjectサブクラスの作成...]を選択します。 。

「RoomItem.h」ファイルに別のエラーがあります。to-manyリレーションシップのデータ型はNSSet、ではなく、NSMutableSetです。

Xcodeで作成された管理対象オブジェクトのサブクラスファイルを使用すると、このような不整合やエラーを回避するのに役立ちます。コアデータモデルを変更した後、ファイルを再作成することを忘れないでください。

(完全を期すために: mogeneratorなど、管理対象オブジェクトのサブクラスを作成するための他のツールもあります。これは一部の人が推奨しています。)


これは、関係がどのように見えるべきかを単純化したものです。

ここに画像の説明を入力してください

  • reports:からRoomItemReportItem to-many関係)、
  • room:fromReportItemからRoomItem(to-one関係、逆reports)。
于 2012-12-16T10:57:04.983 に答える
1

コアデータモデルを更新するときにもこれを経験しました。場合によっては、シミュレーターが古いモデルを保持しているように見えます。これは通常、シミュレーターからアプリを削除し、クリーン/ビルドすることで修正できます。

于 2012-12-16T00:04:37.450 に答える