2011-12-30 10 views
2

私はCoreDataスタックにカスタムクラスを使用しています。クラスプロパティはモデルで正しく設定されています。 NSManagedObject上でsetValue ...を使うために抽象化されているアプリケーションのいくつかの点がありますが、NSInvalidArgumentExceptionで失敗するケースがいくつかあります。特に、関連オブジェクトを設定するときです。エラーは、特定のタイプが必要であることを示し、NSManagedObjectを取得しているため、エラーです。だから、ある種のエンティティであれば、私はちょうど短いルートをとって、問題のコールの前にインスタンスをキャストすると思った。このような:NSManagedObjectをサブクラス型にキャストする際の問題

NSManagedObject *addressObject = [NSEntityDescription insertNewObjectForEntityForName:@"Address" inManagedObjectContext:[object managedObjectContext]]; 
    if ([[[object entity]name] isEqualToString:@"Hospital"]) { 
     Contact *contact = (Contact*)object; 
     DLog(@"The class of contact is: %@", [contact class]); 
     contact.Address = addressObject; 

    } 
    else{ 
     [object setValue:addressObject forKey:@"Address"]; 
    } 

私が知っている、住所は大文字すべきではありません。私はこの混乱を継承しました...とにかく、私は完全に連絡先オブジェクトが連絡先だと思いますが、そうではありません、それはNSManagedObjectです!私はキャストに何が間違っていますか?私が見つけたことは、これがキャストする正しい方法だと言いますが、何らかの理由でここで私にとってうまくいきません。もちろん、addressObjectがContactの代わりにNSManagedObjectを取得することについて文句を言っていない場合は、これは必要ではありません(病院はここから連絡を受け継いでいます)。どのようにしてオブジェクトを強制的にタイプコンタクトにすることができますか?それは本当ですか?アプリを終了

*キャッチされない例外により「NSInvalidArgumentException」、理由:「対1の関係のための値の許容できないタイプ:

はここに関連するトレースのプロパティ= 『連絡先』。希望のタイプ=連絡先。指定された型= NSManagedObject;

@dynamic Contact; 

たぶん私は必要があります。通常、ダイナミックなどの連絡先の実装と

@property (nonatomic, retain) NSManagedObject * Contact; 

:値= ...完全期すため

、Addressクラスは、として連絡先の宣言を持っていますいくつかの睡眠? ;-)ありがとう

答えて

2

キャストは問題ではありません。キャストはオブジェクトがどのクラスであるかを変えません。ちょうどコンパイラがと思うのはだと思います。

あなたのオブジェクトはNSManagedObjectですが、Contactインスタンスではありません。あなたのコードではエンティティであるobjectがあります。 HospitalエンティティがContactクラス(またはサブクラス)を使用するように設定されていることを再度確認します。

エンティティの継承とObjective-Cクラスの継承が一致する必要はないことに注意することが重要です。私。 HospitalContactのサブエンティティにすることができ、ContactクラスのサブクラスにマップするHospitalのないContactクラスへのContactエンティティマップを依然として持っています。 Hospitalエンティティは(同じ)Contactクラスにマップするか、NSManagedObject(これは私があなたが行ったと思われるものです)にマップすることは有効です。

これは混乱しているように見えますが、正しく使用すると非常に強力です。

+0

ありがとうございました。病院はコンタクトクラスとエンティティを拡張します。だから、もし私がこれをキャストすることができないのであれば、NSManagedObjectを使ってContact属性を設定するときにInvalidArgExcをスローしないようにするにはどうすればよいですか?私はちょうどそれが解決するだろうと右のタイプに管理オブジェクトを鋳造すると仮定し、最も速い解決策でした。再度ありがとう – wkhatch

+0

ああ!カスタムサブクラスはターゲットに追加されませんでした。私はそれを逃したとは信じられません。 NSManagedObjectのサブクラスが常にNSManagedObjectとして返されるような問題が発生したときは、モデルのクラスプロパティを設定しなかったか、クラスがターゲット。ダニエルそれはすべて;-)ダニエルありがとう – wkhatch

1

だから、私はいくつかの睡眠が必要でした;-)問題はサブクラスがターゲットに含まれていないことでした。私はあなたがサブクラスを持っているときに同様の問題を経験したことを知っています。それはターゲットにありますが、モデルにカスタムサブクラスを定義することも忘れてしまいます。

+0

それはちょうど私の穴から私を持っているので、答えを返して記入してくれてありがとう!私は、プロジェクトファイルのマージ競合を(ひどく)解決したときに、一部のクラスのコンパイル指示が欠落していることがあります。 NSManagedObjectのサブクラスであるITがまだコンパイルされていたにもかかわらず、私が把握できなかった曖昧な理由のために。駄目だ。 – Damo

関連する問題