我在核心数据方面遇到了一些问题,所以我希望有人能够帮助我:)
第一个问题,我有一个如下所示的数据模型:
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 之前设置非逆关系,则核心数据不会自动设置逆关系,对吗?
无论如何,我永远不需要逆,所以即使我收到警告,我可以避免定义它们吗?
第二个问题,在特定情况下,我需要创建一个新的“R”并在 MOC 保存期间将其分配给“C”、“D”、..、“G”。所以我想使用 willSave 但是,我不知道创建的实体是否会被保存。如果 MOC 对“insertedObjects”/“updatedObjects”/“deletedObjects”执行一个简单的循环,并且对于每个对象调用 willSave,执行保存,然后调用 didSave,这意味着我将修改数组它正在迭代,然后它应该崩溃不是吗?
正如你和我都独立地发现的困难一样,对于相互继承的实体要非常非常小心。我也发现核心数据倾向于创建一个巨大的表,其中包含基本实体的所有字段以及从其派生的所有实体,因此任何给定的实体都包含从其最远祖先向下的每个潜在实体的字段。非常非常慢而且昂贵。
我强烈建议仅让实体类本身相互继承,并在所有实体中镜像基类的属性,而不在托管对象模型本身中进行任何实际继承。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)