核心数据过滤器抽象实体

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,而不是相反。目前尚不清楚您要实现什么目标,因此我无法真正评论解决它的方法。为什么需要单独的 TextFieldDateField 实体? (而不是将它们作为 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 合并为一个实体。这将是一个相当简单的逻辑检查来确定您正在处理的情况。

【讨论】:

以上是关于核心数据过滤器抽象实体的主要内容,如果未能解决你的问题,请参考以下文章

按祖父母实体关系过滤核心数据

如何按不相关的实体过滤核心数据

从出现在 NSPopUpButton 列表中的核心数据实体中过滤条目

使用基于属性的过滤子元素集获取核心数据实体

使用 NSPredicate 过滤核心属性和实体

过滤与核心数据的关系