是否每个核心数据关系都必须有一个逆数据关系?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

假设我有两个实体类:SocialAppSocialAppType

SocialApp我有一个属性:appURL还有一种关系:type.

SocialAppType我有三个特点:baseURLnamefavicon.

SocialApp关系type中的单个记录:SocialAppType.

例如,对于多个Flickr帐户,将有许多SocialApp记录,每条记录都保存着一个人的帐户链接。

会有一个SocialAppType记录“Flickr”类型,即所有SocialApp记录会指向。

当我用这个模式构建一个应用程序时,我会收到一个警告,即在SocialAppTypeSocialApp.

 /Users/username/Developer/objc/TestApp/TestApp.xcdatamodel:SocialApp.type: warning: SocialApp.type -- relationship does not have an inverse

我需要一个逆,为什么?

提问于
用户回答回答于

在实践中,我没有因为没有一个相反的数据而丢失任何数据--至少据我所知。一个快速的Google建议你应该使用它们:

反向关系不仅使事情变得更整洁,它实际上被Core数据用来维护数据完整性。

通常应该对两个方向的关系进行建模,并适当地指定逆关系,核心数据使用这些信息来确保对象图的一致性。

用户回答回答于

苹果文档中有一个很好的例子,它说明了一种情况,在这种情况下,你可能会因为没有相反的关系而有。让我们把它映射到这个案子里。

假设将其建模如下:

注意你有一个一对一关系称为“类型“,从SocialAppSocialAppType。关系是非任选并且有一个“拒绝”删除规则.

现在考虑以下几点:

SocialApp *socialApp;
SocialAppType *appType;
// assume entity instances correctly instantiated

[socialApp setSocialAppType:appType];
[managedObjectContext deleteObject:appType];
BOOL saved = [managedObjectContext save:&error];

当appType被删除时,SocialApp实例不会被标记为更改。

因此,在保存之前,没有对SocialApp进行验证(假设不需要验证,因为没有发生任何更改)

如果我们召回appType

SocialAppType *appType = [socialApp socialAppType];

appType是零。

很奇怪,不是吗?我们的非可选属性为零?

如果你已经建立了逆关系,就不会有麻烦了。否则,必须通过编写代码强制验证,如下所示。

SocialApp *socialApp;
SocialAppType *appType;
// assume entity instances correctly instantiated

[socialApp setSocialAppType:appType];
[managedObjectContext deleteObject:appType];

[socialApp setValue:nil forKey:@"socialAppType"]
BOOL saved = [managedObjectContext save:&error];

扫码关注云+社区