2014-02-14 46 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合并成一个实体。这将是一个相当简单的逻辑检查,以确定您处理的是哪种情况。