核心数据继承与无继承

时间:2012-09-24 12:58:39

标签: ios core-data nsmanagedobject nsmanagedobjectcontext

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

第一个问题,我有一个如下所示的数据模型:

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

当你和我都独立发现困难的方式时,要非常非常小心彼此继承的实体。我也发现Core Data倾向于创建一个包含基本实体的所有字段的巨型表以及从中派生的所有实体,因此任何给定的实体都包含从其最远祖先向下的每个潜在实体的字段。非常,非常慢和昂贵。

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

相关问题