核心数据继承与无继承

Posted

技术标签:

【中文标题】核心数据继承与无继承【英文标题】:Core Data inheritance vs no inheritance 【发布时间】:2012-09-24 12:58:39 【问题描述】:

我在核心数据方面遇到了一些问题,所以我希望有人能够帮助我:)

第一个问题,我有一个看起来像这样的数据模型:

 Entity P (A) <----> Entity R
  / | \
 / /\ \ 
/ / | \ \
C D E F G

我所有的实体都继承自同一个实体“P”,因为它们需要一个共同的属性和一个共同的关系(“A”和“R”)

我遇到的问题是,当您使用继承时,核心数据使用只会为所有实体生成一个 sqlite 表。在我的情况下,这意味着我的数据库将只有 1 个表用于所有数据。我做了一些研究,发现它会产生性能问题(此外,我所有的实体属性都是瞬态的,并且在 willSave 期间,它们的值被聚合+加密到存储在“A”中的一个 NSData 中,所以我将无法使用谓词进行过滤并提高 SELECT 性能)。所以我决定删除“P”,并将“A”添加到“C”,“D”......,“G”中。问题在于“R”,因为之前我只有一个反向关系,现在我每次创建一种新实体时都需要创建一个。 所以我想删除所有的反向关系,这可能吗? 有时我需要使用 nil 上下文创建托管对象,然后我将它们插入上下文中,这可能就是为什么如果我在插入 MOC 之前设置非逆关系,核心数据不会自动设置逆关系? 无论如何,我从不需要逆向,所以即使我收到警告,我也可以避免定义它们吗?

第二个问题,在特定情况下,我需要在 MOC 保存期间创建一个新的“R”并将其分配给“C”、“D”、..、“G”。所以我想使用 willSave 但是,我不知道创建的实体是否会被保存。如果 MOC 对“insertedObjects”/“updatedObjects”/“deletedObjects”进行简单循环,并且对于它调用 willSave 的每个对象,执行保存,然后调用 didSave,这意味着我要修改数组它正在迭代,然后它应该不会崩溃?

【问题讨论】:

RE 逆问题。您不必明确设置反向关系。只要您在架构中设置了反向关系,那么当您以一种方式添加关系时,CoreData 会自动为您设置反向关系。 1,如果用“nil” MOC创建对象,设置关系,然后将对象分配给MOC,似乎不是这种情况。第二,我不想在模式中定义逆,如果我必须这样做,每次我将创建一个新实体时,我都必须创建它的逆。 【参考方案1】:

因为你和我都独立地发现了困难的方式,所以对相互继承的实体要非常非常小心。我也发现 Core Data 倾向于制作一个包含基本实体的所有字段以及从它派生的所有实体的巨型表,因此任何给定的实体都包含从其最远祖先向下的每个潜在实体的字段。非常非常缓慢且昂贵。

我强烈建议只让实体类本身相互继承,并在所有实体中镜像基类的属性,而不在托管对象模型本身中进行任何实际继承。

【讨论】:

这就是我最终所做的......即使表中有一个 ZENT 字段包含可能被核心数据索引并用于提取更少数据的实体类型,仍然会生成带有很多行。【参考方案2】:

核心数据不是你的 sql 表的包装器。它处理对象图及其持久性。 SQLite 存储只是持久化它的一种方式。检查一下。 Prevent Core Data From Combining Entities into One Table

【讨论】:

从您刚刚引用的主题中:“如果您有大量相同实体继承树的对象,您可能会遇到一些非常高端的性能问题,例如 20k+ 个对象,否则不会。”。正如我所说,我有一个完全加密的数据库,这意味着核心数据将无法做很多事情来优化,没有谓词,没有排序...... Core Data 不仅仅是持久化对象,它还具有许多功能,如撤消管理、模式迁移、验证等。您只需花费很少的开销即可获得所有这些。对于核心数据优化,请查看有关核心数据的 Apple 文档。 developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…

以上是关于核心数据继承与无继承的主要内容,如果未能解决你的问题,请参考以下文章

使用核心数据的父实体继承和反向关系

核心数据:继承、STI 还是其他?

核心数据。无法根据与继承实体的关系来获取/排序实体

核心数据继承:这样做可以吗?

核心数据继承 - 管理子类的反向关系

迁移复杂的核心数据模型