3 回答
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];
TA贡献1829条经验 获得超7个赞
我将解释我在Dave Mark和Jeff LeMarche的更多iPhone 3开发中找到的明确答案。
Apple通常建议您始终创建并指定反向,即使您不在应用程序中使用反向关系。因此,当您未能提供反向时,它会发出警告。
关系不需要具有逆,因为在一些场景中,逆关系可能会损害性能。例如,假设反向关系包含极大数量的对象。去除逆需要迭代表示反向弱化性能的集合。
但除非你有特殊的理由不这样做,否则建模。它有助于核心数据确保数据完整性。如果遇到性能问题,以后删除反向关系相对容易。
- 3 回答
- 0 关注
- 527 浏览
添加回答
举报