2

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

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

 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,这意味着我要修改数组它正在迭代,然后它应该崩溃吗?

4

2 回答 2

0

核心数据不是你的 sql 表的包装器。它处理对象图及其持久性。SQLite 存储只是持久化它的一种方式。检查一下。 防止核心数据将实体合并到一个表中

于 2012-09-25T05:29:12.150 回答
0

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

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

于 2014-12-23T19:08:05.633 回答