假设我有两个实体类:SocialApp
和 SocialAppType
在 SocialApp
我有一个属性:appURL
和一个关系:type
。
在 SocialAppType
我有三个属性:baseURL
、name
和 favicon
。
SocialApp
关系type
的目的地是SocialAppType
中的一条记录。
例如,对于多个 Flickr 帐户,会有许多 SocialApp
记录,每条记录都包含一个人帐户的链接。 “Flickr”类型将有一个 SocialAppType
记录,所有 SocialApp
记录都将指向该记录。
当我使用此架构构建应用程序时,我收到一条警告,提示 SocialAppType
和 SocialApp
之间没有反向关系。
/Users/username/Developer/objc/TestApp/TestApp.xcdatamodel:SocialApp.type: warning: SocialApp.type -- relationship does not have an inverse
我需要逆向吗?为什么?
最佳答案
Apple 文档中有一个很好的示例,该示例表明您可能会因为没有反向关系而遇到问题。让我们把它映射到这个案例中。
假设您对其建模如下:
请注意,您有一个称为“type”的一对一关系,从 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 进行验证(它假设不需要验证,因为没有发生任何变化)。但实际上发生了变化。但它没有得到反射(reflect)。
如果我们通过
来记忆appTypeSocialAppType *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/