2011-12-30 68 views
2

我爲我的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; 

也許我需要有些睡眠? ;-)謝謝

回答

2

演員陣容不是你的問題。鑄造不會改變對象的類別 - 編譯器認爲它是

您的對象是NSManagedObject,但不是Contact實例。在你編碼object你有一個Hospital實體。仔細檢查Hospital實體是否設置爲使用Contact類(或子類))。

重要的是要注意實體繼承和Objective-C類繼承不必匹配。即您可以將Hospital作爲Contact的子條目,並且仍然將Contact實體映射到Contact類,而不將Hospital映射到Contact類的子類。它是有效的Hospital實體映射到(相同)Contact類,甚至到NSManagedObject(這是我懷疑你已經完成)。

這看起來可能會讓人困惑,但如果使用正確,可能會非常強大。

+0

謝謝丹尼爾。醫院擴展了Contact類和實體。所以,如果我無法擺脫這一點,我怎麼能得到地址使用NSManagedObject設置它的Contact屬性時不拋出InvalidArgExc?我只是假設將管理對象轉換爲正確的類型可以解決問題,並且是最快的解決方案。再次感謝 – wkhatch 2011-12-30 14:59:56

+0

啊哈!自定義子類沒有被添加到目標中......補充它;我不能相信我錯過了這一點。我應該知道,因爲每當我看到NSManagedObject的子類始終作爲NSManagedObject返回的類似問題時,它可能是您沒有在模型中設置類屬性,或者...您的類不在目標。當這一切;-)感謝丹尼爾 – wkhatch 2011-12-30 15:51:27

1

所以是的,事實證明我確實需要一些睡眠;-)問題是沒有包含在目標中的子類。我知道我有類似的問題,當你有一個子類,它在目標中,但你忘了在模型中定義自定義子類。

+0

謝謝你回來,並填寫答案,因爲它只是讓我出了一個洞!我發現有時當我(很糟糕)解決了我的項目文件中的合併衝突時,某些類的編譯指令不見了。有一個難以理解的原因,我一直無法弄清楚,儘管這發生在我的NSManagedObject子類IT仍然編譯。補充它。 – Damo 2012-01-17 15:13:51