Ios 核心数据继承与非继承

Ios 核心数据继承与非继承,ios,core-data,nsmanagedobject,nsmanagedobjectcontext,Ios,Core Data,Nsmanagedobject,Nsmanagedobjectcontext,我在核心数据方面遇到一些问题,因此我希望有人能够帮助我: 第一个问题,我有一个如下的数据模型: Entity P (A) <----> Entity R / | \ / /\ \ / / | \ \ C D E F G 我的所有实体都从同一个实体p继承,因为它们需要一个公共属性和一个公共关系a和R 我遇到的问题是,使用继承时,核心数据只为所有实体生成一个sqlite表。在我的例子中,这意味着我的数据库将只有一个表用于所有数据。我做了一些研究,发现这会造成性能问题,而且我所

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

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

 Entity P (A) <----> Entity R
  / | \
 / /\ \ 
/ / | \ \
C D E F G
我的所有实体都从同一个实体p继承,因为它们需要一个公共属性和一个公共关系a和R

我遇到的问题是,使用继承时,核心数据只为所有实体生成一个sqlite表。在我的例子中,这意味着我的数据库将只有一个表用于所有数据。我做了一些研究,发现这会造成性能问题,而且我所有的实体属性都是瞬态的,在保存期间,它们的值被聚合并加密到一个NSData中,存储在一个NSData中,因此我无法使用谓词来过滤和改进SELECT性能。所以我决定去掉P,在C,D。,G中加上A。问题在于R,因为以前我只有一个反向关系,现在我每次创建一个新的实体时都需要创建一个。 所以我想去掉所有的反向关系,有可能吗? 有时我需要创建一个具有nil上下文的托管对象,然后我将它们插入到上下文中,这可能就是为什么如果我在插入MOC之前设置了非反向关系,那么核心数据不会自动设置反向关系的原因,对吗? 无论如何,我从不需要相反的结果,所以即使我得到警告,我也可以避免定义它们吗


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

核心数据不是sql表的包装器。它处理对象图及其持久性。SQLite存储只是持久化它的一种方式。检查一下。
核心数据不是sql表的包装器。它处理对象图及其持久性。SQLite存储只是持久化它的一种方式。检查一下。

当你和我都独立地发现困难的时候,要非常非常小心从彼此继承的实体。我也发现,核心数据往往会形成一个巨大的表,其中包含基本实体的所有字段以及从中派生的所有实体,因此任何给定实体都包含从其最远祖先向下的每个潜在实体的字段。非常非常慢而且昂贵


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

正如您和我都独立发现的困难之道,非常,对相互继承的实体非常小心。我也发现,核心数据往往会形成一个巨大的表,其中包含基本实体的所有字段以及从中派生的所有实体,因此任何给定实体都包含从其最远祖先向下的每个潜在实体的字段。非常非常慢而且昂贵


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

从您刚才引用的主题来看:如果您有大量相同实体继承树的对象,您可能会在非常高端遇到一些性能问题,例如20k+对象,但在其他方面则不会。。正如我所说,我有一个完全加密的数据库,这意味着核心数据将不能做很多事情来优化,没有谓词,没有排序……核心数据不仅仅是持久化对象,它还具有许多功能,如撤销管理、模式迁移、验证等。您只需少量开销就可以实现所有这些。有关核心数据优化的信息,请查看此apple核心数据文档。从您刚才引用的主题来看:如果您有大量相同实体继承树的对象,您可能会在非常高端遇到一些性能问题,例如20k+对象,但其他方面不会。。正如我所说,我有一个完全加密的数据库,这意味着核心数据将不能做很多事情来优化,没有谓词,没有排序……核心数据不仅仅是持久化对象,它还具有许多功能,如撤销管理、模式迁移、验证等。您只需少量开销就可以实现所有这些。有关核心数据优化的信息,请查看此apple核心数据文档。这是一个反问题。您不必显式地设置反向关系。只要您在模式中设置了反向关系,那么当您添加关系时,CoreData就会自动为您设置反向关系。
首先,如果对象是使用nil MOC创建的,关系被设置,然后对象被分配给MOC,则情况似乎并非如此。第二,我不想在模式中定义逆,如果我必须这样做,每次我创建一个新实体时,我都必须创建它的逆。您不必显式地设置反向关系。只要您在模式中设置了反向关系,那么当您添加单向关系时,CoreData会自动为您设置反向关系。1.如果对象是使用nil MOC创建的,则似乎不是这种情况,关系已设置,然后对象被分配给MOC。第二,我不想在模式中定义逆,如果我必须这样做,每次我都要创建一个新实体,我必须创建它的逆。这就是我最后做的。。。即使表中有一个包含实体类型的ZENT字段,该实体类型可能被索引并被核心数据用来提取较少的数据,它仍然会生成包含大量行的表。这就是我最后所做的。。。即使表中有一个ZENT字段包含实体类型,该实体类型可能已被索引并被核心数据用来提取较少的数据,它仍然会生成包含大量行的表。