2009-12-02 10 views
7

私が使用してNSManagedObjectサブクラスを初期化しています:NSManagedObjectのサブクラスとsetValuesForKeysWithDictionary:

- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues 

私も故意にそれを当然例外をスローする必要が未定義のキーを、与えています。

だから、私が実施している:

- (void)setValue:(id)value forUndefinedKey:(NSString *)key 

キーが定義されていない場合、私は正しいキーにマップします。

の実装が使用されていますが、でもが例外をスローします。

setValuesForKeysWithDictionary:がサブクラスの実装setValue:forUndefinedKey:を使用できないような動作(またはバグ)はありますか?

要求されるようにコードを追加しますが、私は呼び出されません既存のメソッドを実装おりますので、私はそれがどのくらいの助けを知らない:文脈では

- (Company*)companyWithDictionary:(NSDictionary*)values{ 

    Company* newCompany = (Company*)[NSEntityDescription insertNewObjectForEntityForName:@"Company" inManagedObjectContext:self]; 

    [newCompany setValuesForKeysWithDictionary:values]; 

    return newCompany; 
} 
Companyサブクラス(と呼ばれることはありません)で

- (void)setValue:(id)value forUndefinedKey:(NSString *)key{ 

    if([key isEqualToString:idKey]){ 

     [self setValue:value forKey:@"uniqueID"]; 

    }else if([key isEqualToString:descriptionKey]){ 

     [self setValue:value forKey:@"descriptionText"]; 

    }else if([key isEqualToString:timeUpdatedKey]){ 

     [self setValue:value forKey:@"dateUpdated"]; 

    }else{ 

     [super setValue:value forUndefinedKey:key]; 

    } 
} 

答えて

3

これを防ぐNSManagedObjectに固有のものは間違いありません。私は私が取り組んでいるアプリでこれを正確にやっています。もっとコードを投稿できますか?

考えてみてください。例外を投げているのはsetValue:forUndefinedKey:ですか?管理対象オブジェクトの場合、正しく動作させるためにvalueForUndefinedKey:(getter)を実装する必要があることは確かです。

+0

はい、スタックトレースに表示されます。そして、それは間違いなくNSManagedObjectの実装です。 –

+0

私はvalueForUndefinedKey:を実装していません。私はそれを試してみるが、なぜそれがセッターを突き抜けてしまうのか分からない。 –

+0

いくつかのコードを追加しました... –

2

簡単な質問ですが、モデル内のエンティティのNSManagedObjectサブクラスのクラス名を指定していますか?

また、管理対象オブジェクトを初期化しています...どうですか?あなたは+ [NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:]を介してそれを挿入しなければなりません。

+0

はいとはい。モデルクラスも再作成しました。私はまた、modelクラスにvalueFOrUndefinedKeyを実装し、カテゴリとして実装しようとしました。 –

+0

それは確かに奇妙です。テストケースを減らしてこれを再現できますか?私は似たようなことをやったが、この問題に遭遇したことはなかった –

1

CoreDataフレームワークのクイッククラスダンプは、NSManagedObjectsetValuesForKeysWithDictionary:をオーバーライドしていることを示しています。そのため、パフォーマンス上の理由などで、おそらくそのメソッドのカスタマイズが行われているようです。私はおそらくちょうどsetValuesForKeysWithDictionary:に相当する私自身の方法を書いて、代わりに全体の混乱を避けるためにそれを呼び出すでしょう。このようなもの:

- (void)mySetValuesForKeysWithDictionary:(NSDictionary*)dict 
{ 
    for (NSString* key in dict) 
     [self setValue:[dict objectForKey:key] forKey:key]; 
} 
+0

は本質的に私がやったことですが、NSNull値を考慮しています。 Sixtenのソリューションを実装した後でさえ、いくつかの奇妙なエラーがあったので、私はタオルに投げました。 –

関連する問題