为了账号安全,请及时绑定邮箱和手机立即绑定

每个核心数据关系都必须有反向吗?

每个核心数据关系都必须有反向吗?

哈士奇WWW 2019-08-27 11:09:43
每个核心数据关系都必须有反向吗?假设我有两个实体类:SocialApp和SocialAppType在SocialApp我有一个属性:appURL和一个关系:type。在SocialAppType我有三个属性:baseURL,name和favicon。SocialApp关系的目的地type是单个记录SocialAppType。例如,对于多个Flickr帐户,会有许多SocialApp记录,每条记录都包含指向某个人帐户的链接。会有一个SocialAppType针对“Flickr的”类型的记录,所有SocialApp记录将指向。当我使用这个模式构建一个应用程序时,我得到一个警告,即SocialAppType和之间没有反比关系SocialApp。 /Users/username/Developer/objc/TestApp/TestApp.xcdatamodel:SocialApp.type: warning: SocialApp.type -- relationship does not have an inverse我需要反转,为什么?
查看完整描述

3 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

在实践中,由于没有反向,我没有任何数据丢失 - 至少我知道。谷歌快速建议你应该使用它们:

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

Cocoa Dev Central

您通常应该在两个方向上建模关系,并适当地指定反向关系。如果进行了更改,Core Data会使用此信息来确保对象图的一致性(请参阅“操作关系和对象图完整性”)。有关您可能不想在两个方向上建模关系的一些原因的讨论,以及可能出现的一些问题,请参阅“单向关系”。

核心数据编程指南


查看完整回答
反对 回复 2019-08-27
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

Apple文档有一个很好的例子,表明你可能因为没有反向关系而遇到问题。让我们把它映射到这种情况。


假设您将其建模如下: 在此输入图像描述


注意:您有一个到一个所谓的“关系型 ”,从SocialApp到SocialAppType。该关系是非可选的,并且具有“拒绝”删除规则。


现在考虑以下内容:


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];


查看完整回答
反对 回复 2019-08-27
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

我将解释我在Dave Mark和Jeff LeMarche的更多iPhone 3开发中找到的明确答案。

Apple通常建议您始终创建并指定反向,即使您不在应用程序中使用反向关系。因此,当您未能提供反向时,它会发出警告。

关系不需要具有逆,因为在一些场景中,逆关系可能会损害性能。例如,假设反向关系包含极大数量的对象。去除逆需要迭代表示反向弱化性能的集合。

除非你有特殊的理由不这样做,否则建模。它有助于核心数据确保数据完整性。如果遇到性能问题,以后删除反向关系相对容易。


查看完整回答
反对 回复 2019-08-27
  • 3 回答
  • 0 关注
  • 527 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信