2016-09-05 42 views
1

我在我的模型中有一個名爲P的父實體我也有一個名爲C的子實體我使用內置到核心數據中的實體繼承功能,因爲這爲我解決問題(從我閱讀和理解的內容)。iOS實體繼承父數據中沒有檢索到兒童的提取

這裏是我的情況:

在我發展的早期版本,我在P實體創造了多項紀錄。後來我添加了C實體並將父實體設置爲P.C僅包含一個屬性。由於應用程序的設計,最好有實體繼承,而不是將屬性包含在父實體中。

縱觀網絡上和蘋果的文檔中的文章,我的理解是一個SQLite持久性存儲將是一個單一的表這可能會導致性能問題的所有屬性,但我接受這個(現在)。

見到這種情景,它似乎是由C獲取的所有條目將返回所有在P.我發現,情況並非如此的條目。測試的一位表示,這似乎是發生了什麼:

  • 的對象持久化至P在C取不出來,但將在P的取
  • 的對象持久化到C會取現身P和C的
  • 刪除對象添加到C從P將來自P和C.
  • 都刪除它

這是我的取代碼:

NSError *error; 
NSFetchRequest *request  = [NSFetchRequest fetchRequestWithEntityName:@"C"]; 
request.predicate   = predicate; 
request.includesSubentities = YES; 
NSManagedObjectContext *moc = self.managedObjectContext; 
NSArray *results   = [moc executeFetchRequest:request error:&error]; 

謂詞爲零,以便獲取實體中的所有對象。提取請求中沒有錯誤。

這裏是我的問題:

  1. 有一個查詢,我應該對C可以返回原來只向對所有項目使用?
  2. 如果沒有,是否有辦法將C同步到P中的現有項目?

我在這個網站和其他網站上搜索了實體繼承,雖然有大量有用的信息,但似乎沒有人解決這個問題(儘管我可能錯過了某些我確定的東西)。

我非常希望能夠添加/編輯/刪除是與P牽強,但有結果的對象顯示C.這可能嗎?從我的早期測試中可以看出刪除工作正常,但肯定不會。編輯尚未經過測試。

任何和所有幫助讚賞!

+0

編輯的工作原理如下預期。也就是說,從P中獲取,編輯對象,保存爲P.然後從C中獲取並按預期編輯。所以唯一的問題是原始帖子中問題的答案。 – gemini0725

回答

0

你描述的是我期望的。一旦你創建了實體P的一個實例,它就不會(也不能成爲)實體C的一個實例。因此實體C的提取將永遠不會返回這些對象。

但是,因爲實體C是P的子實體,實體C 的實例也是實體P的實例 - 儘管是具有額外屬性的「特殊」實例。因此,實體P的提取會(假設您已將includesSubentities設置爲YES)返回C實體和(普通)P實體。(舉例而言,如果P是「動物」和C「狗」,狗動物,並且這樣的抓取動物應包括狗,但一個取爲狗不應包括任何其他類型的動物的。)

如果您使用對於P實體獲取取一個對象,並刪除它,那麼對象 - 它是否真的是C或P的一個實例 - 將被刪除,從商店中移除。所以它不會再出現在C實體或P實體的提取中。

因此,要回答你的具體問題:

  1. 沒有,有沒有辦法取回用於實體C到包括創建和P.實體的實例
  2. 只有這樣,才能「轉換存儲對象「P到C實例中的實例將創建C的新實例並複製相關屬性值(可能包括額外屬性的默認值),然後刪除P.的原始實例。
+0

非常感謝。你的答案有很大的意義。我不這麼認爲,但你的動物/狗比喻非常清楚。要遵循,如果我要補充一點,過的「動物」父「貓」的實體我當然不希望所有的「狗」 S也被「貓」 S!讓我玩一下,但我相信這將是我正在尋找的答案。 – gemini0725

+0

喜歡它。按預期工作(現在)。謝謝! – gemini0725