2

文字列の配列を格納するための GameData エンティティがあります。そこで、値文字列属性を持つ「値」エンティティを作成し、2 つのエンティティ間に多対多の関係を作成しました。

データを保存するには、次のコードを使用します。

//Save values
NSMutableSet* values = [[NSMutableSet alloc] init];
for(NSString* n in gameData.values){
    NSManagedObject *val = [NSEntityDescription
                               insertNewObjectForEntityForName:@"Value"
                               inManagedObjectContext:context];
    [val setValue:n forKey:@"value"];
    [values addObject:val];
}
[gd setValue:values forKey:@"values"];

gameData.values 配列は現在空であるため、コードが実際に for ループに入ることはありません...しかし、何らかの理由で[gd setValue:values forKey:@"values"]、次のエラーでこの行でクラッシュします。

-[__NSSetM managedObjectContext]: unrecognized selector sent to instance 0x1f0485d0

managedObjectContextNSMutableSet の値にセレクターを送信する場所または方法は??

4

2 に答える 2

1

エンティティのタイプが「To Many」かどうかを確認する必要があるかもしれません。 ここに画像の説明を入力

于 2015-02-03T02:38:32.197 に答える
0

コメントできないので、回答を作成しています。

xcode を使用してエンティティのサブクラスを作成し、それらのヘッダー ファイルをインポートして、以下のようなコードを使用してみませんか

    //Save values
    //NSMutableSet* values = [[NSMutableSet alloc] init]; -- No Need of this

    for(NSString* n in gameData.values){
        Value *val = [NSEntityDescription
                                   insertNewObjectForEntityForName:@"Value"
                                   inManagedObjectContext:context];
        [val setValue:n];  // set your string
        [val setGame:gd]; //  set the game relation here. you can do this, if you have 

構成された逆関係。逆の関係を作成しない場合は役立ちます。

    } 
    //[gd setValue:values forKey:@"values"]; you don't need this.

コンテキストを保存するだけです。すべてがうまくいくはずです。これはあなたの方法よりもはるかにきれいです。コア データ エンティティ プロパティにアクセスするためにキー値を使用したことはありません。プロパティの正確なスペルを覚えておく必要があるため、混乱を招き、エラーが発生しやすく、間違ったスペルや間違ったキーを使用してもエラーがスローされないためです。

コア データ プログラミング ガイドを参照する必要があると思います

編集: GameEntity が文字列の配列を格納する場合、1 対多の関係で十分です。GameEntity に多くの文字列があり、各文字列、つまり Value エンティティにも多くの GameEntity がある場合にのみ、多対多が必要です。その場合、上記のコードはわずかに変更されます。

それ以外の

[val setGame:gd];

使用する必要があります

[val addGameObject:gd];
于 2013-02-23T18:25:33.910 に答える