核心数据过滤器抽象实体
Posted
技术标签:
【中文标题】核心数据过滤器抽象实体【英文标题】:Core Data Filter Abstract Entity 【发布时间】:2014-02-14 00:46:35 【问题描述】:我有这个核心数据设置:
Issue
(IssueField)IssueFields (to many, Abstracted)
IssueField
(String)type
TextField : IssueField
(String)text
DateField : IssueField
(Date)date
所以实体Issue与IssueField有很多关系 IssueField 是抽象的,有两个子 TextField,DateField
我想运行一个谓词来查找包含某个日期的任何 DateField 的问题
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Issue"];
request.predicate = [NSPredicate predicateWithFormat:@"any IssueFields.type = %@ and any IssueField.date = %@", @"DateType", today];
但我得到了这个错误: 原因:'keypath IssueField.date not found in entity'
我知道这是由于查询尝试在 TextField 上查找日期,但我该如何解决这个问题?
【问题讨论】:
您的IssueField
实体没有date
属性,因为它是从IssueField
继承的DateField
,而不是相反。目前尚不清楚您要实现什么目标,因此我无法真正评论解决它的方法。为什么需要单独的 TextField
和 DateField
实体? (而不是将它们作为 IssueField
属性?
有一个单独的组件,用于配置一个问题可以为一个项目有多少个字段,这种结构允许将来扩展问题字段以适应新的数据类型。所以Issue有一个IssueField列表,IssueField可以是文本字段或日期字段,还有值列表字段、文档字段、数字字段等。
嗯,为什么不只是有一个 IssueField
实体,它有一个属性 type
和一个属性 value
。 Type 将存储字段类型,而 value 将存储字段值。这也可能有助于developer.apple.com/library/mac/documentation/cocoa/conceptual/…
【参考方案1】:
Core Data 实体不是对象。不应该使用这样的抽象。
首先,当您使用这样的抽象实体和/或实体继承时,您的所有子对象都将存在于 SQLite 的同一个表中。这可能而且确实会导致性能不佳。
其次,Core Data 不是数据库。数据库类型规范化也不适用。在您的情况下,您应该将两个实体 TextField 和 DateField 合并为一个实体。这将是一个相当简单的逻辑检查来确定您正在处理的情况。
【讨论】:
以上是关于核心数据过滤器抽象实体的主要内容,如果未能解决你的问题,请参考以下文章