我爲我的CoreData堆棧使用自定義類。類屬性在模型中正確設置。在應用程序中有一些抽象使用setValue ...在NSManagedObject上,但我有一些情況下,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沒有抱怨獲得一個NSManagedObject而不是一個Contact(對不起,醫院從Contact繼承),那麼這是沒有必要的,這是另一個令人困惑的事情,但首先要做的事情。我如何強制對象鍵入聯繫人,它確實是?
下面是相關的痕跡:
*終止應用程序由於未捕獲的異常「NSInvalidArgumentException」,理由是:「爲一對一的關係不可接受類型的值:屬性=‘聯繫’;所需類型=聯繫人;給定類型= NSManagedObject;值= ...
爲了完整起見,地址類有聲明聯繫人爲:
@property (nonatomic, retain) NSManagedObject * Contact;
與實施聯繫爲正常的動態,如:
@dynamic Contact;
也許我需要有些睡眠? ;-)謝謝
謝謝丹尼爾。醫院擴展了Contact類和實體。所以,如果我無法擺脫這一點,我怎麼能得到地址使用NSManagedObject設置它的Contact屬性時不拋出InvalidArgExc?我只是假設將管理對象轉換爲正確的類型可以解決問題,並且是最快的解決方案。再次感謝 – wkhatch 2011-12-30 14:59:56
啊哈!自定義子類沒有被添加到目標中......補充它;我不能相信我錯過了這一點。我應該知道,因爲每當我看到NSManagedObject的子類始終作爲NSManagedObject返回的類似問題時,它可能是您沒有在模型中設置類屬性,或者...您的類不在目標。當這一切;-)感謝丹尼爾 – wkhatch 2011-12-30 15:51:27