2014-02-14 44 views
1

我有這樣的核心數據設置:核心數據過濾抽象的實體

Issue 
(IssueField)IssueFields (to many, Abstracted) 

IssueField 
(String)type 

TextField : IssueField 
(String)text 

DateField : IssueField 
(Date)date 

所以實體問題有一個與IssueField IssueField抽象,並有兩個孩子的TextField,的DateField

一對多的關係我想運行一個謂語找到問題包含任何的DateField具體日期

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Issue"]; 
request.predicate = [NSPredicate predicateWithFormat:@"any IssueFields.type = %@ and any IssueField.date = %@", @"DateType", today]; 

,但我得到這個錯誤: 原因:「的keyPath IssueFie ld.date沒有在實體中找到'

我明白這是由於查詢嘗試在TextField上查找日期,但我該如何解決此問題?

+0

您的'IssueField'實體沒有'date'屬性,因爲它是從'IssueField'繼承的'DateField'而不是其他方式。目前還不清楚你想要達到什麼目標,所以我不能真正評論解決問題的方法。爲什麼你需要一個單獨的'TextField'和'DateField'實體? (而不是將它們作爲'IssueField'屬性? – Rog

+0

有一個獨立的組件,用於配置項目的問題可以有多少個字段,此結構允許在將來擴展問題字段以適應新的數據類型。 IssueField的列表,IssueField可以是文本字段或日期字段,也可以是值列表字段,文檔字段,數字字段等。 –

+0

嗯,爲什麼不只是擁有'Issue'類型的'IssueField'實體和屬性'值',類型將存儲字段類型,和值將存儲字段值,也可以幫助https://developer.apple.com/library/mac/documentation/cocoa/conceptual/coredata/articles/cdNSAttributes。 HTML – Rog

回答

0

核心數據實體不是對象。不應該使用這樣的抽象。

首先,當您使用像這樣的抽象實體和/或實體繼承時,您的所有子對象都將存在於SQLite的同一個表中。這會導致性能下降。

二,核心數據不是數據庫。數據庫類型規範化也不適用。在你的情況下,你應該將兩個實體TextField和DateField合併成一個實體。這將是一個相當簡單的邏輯檢查,以確定您處理的是哪種情況。