objective-c - 每个核心数据关系都必须有一个逆关系吗?

假设我有两个实体类:SocialAppSocialAppType

SocialApp 我有一个属性:appURL 和一个关系:type

SocialAppType 我有三个属性:baseURLnamefavicon

SocialApp 关系type 的目的地是SocialAppType 中的一条记录。

例如,对于多个 Flickr 帐户,会有许多 SocialApp 记录,每条记录都包含一个人帐户的链接。 “Flickr”类型将有一个 SocialAppType 记录,所有 SocialApp 记录都将指向该记录。

当我使用此架构构建应用程序时,我收到一条警告,提示 SocialAppTypeSocialApp 之间没有反向关系。

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

我需要逆向吗?为什么?

最佳答案

Apple 文档中有一个很好的示例,该示例表明您可能会因为没有反向关系而遇到问题。让我们把它映射到这个案例中。

假设您对其建模如下:

请注意,您有一个称为“type”的一对一关系,从 SocialAppSocialAppType。该关系是非可选的,并且有一个“拒绝”删除规则

现在考虑以下几点:

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

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

我们期望这个上下文保存失败,因为我们将删除规则设置为拒绝,而关系是非可选的。

但这里保存成功。

原因是我们没有设置反向关系。因此,当 appType 被删除时,socialApp 实例不会被标记为已更改。所以在保存之前没有对 socialApp 进行验证(它假设不需要验证,因为没有发生任何变化)。但实际上发生了变化。但它没有得到反射(reflect)。

如果我们通过

来记忆appType
SocialAppType *appType = [socialApp socialAppType];

appType 为零。

很奇怪,不是吗?对于非可选属性,我们得到 nil?

因此,如果您已经建立了反向关系,那么您就不会遇到麻烦。 否则,您必须通过编写如下代码来进行强制验证。

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

https://stackoverflow.com/questions/764125/

相关文章:

iphone - @synthesize 到底是做什么的?

objective-c - 如何将字符串转换为 double ,反之亦然?

ios - 为什么 NSUserDefaults 无法在 iOS 中保存 NSMutableDict

ios - 以编程方式滚动 UIScrollView

iphone - 在 UIViewController 上显示 clearColor UIViewC

objective-c - Xcode 构建失败 "Undefined symbols for ar

ios - 如何使用 AVAudioRecorder 在 iPhone 上录制音频?

ios - 调整 UITableView 的大小以适应内容

objective-c - NSLog iPhone中Objective-C的方法名

ios - iOS 上 Objective-C 中的类型