【问题标题】:Core Data Inverse Relationship Not Being Set未设置核心数据反向关系
【发布时间】:2011-09-05 16:15:24
【问题描述】:

我有两个实体,我将它们称为 A 和 B。它们在两个方向上都配置有 To-Many 关系,因此 A.myBs 和 B.myAs 都是 NSSet。

这是我的奇怪问题。

当我将 B 添加到我的 A 实体时,我使用 mutableSetValueForKey 来执行此操作,如下所示:

NSMutableSet *myBSet = [myA mutableSetValueForKey:@"myBs"];
[myBSet addObject:theBtoAdd];

这确实将 theBtoAdd 添加到 A 实体,但不添加反向关系。核心数据上下文保存不会出现任何错误,但我的 A 对象没有 B 逆集。如果我退出应用程序,即使部分关系也不会保存。

这是奇怪的部分......如果我只是切换我的代码并做相反的事情(有一些原因,这对于我的特定应用程序来说更难做到) - 将 A 添加到 B 而不是像这样将 B 添加到 A :

NSMutableSet *myASet = [myB mutableSetValueForKey:@"myAs"];
[myASet addObject:theAtoAdd];

它工作得很好。顺便说一句,我还有很多其他有效的关系。只是这个没有。

其他几件事: 1) 我的核心数据对象模型看起来不错,但这是我在 Xcode 4 下添加的第一个新实体 2) 我已经检查、重新检查并盲目地看着我的自定义 NSManagedObjects,但它们看起来很好 - 声明为动态、NSSet、没有冲突的 setter/getter...等等。

任何帮助或调试建议将不胜感激。谢谢!

【问题讨论】:

  • 你有想过这个吗?我遇到了同样的问题:(

标签: ios core-data xcode4 entity-relationship inverse


【解决方案1】:

我刚刚遇到了同样的问题,这就是我看到这个问题的原因。也许我的解决方案会帮助一些处于相同情况的人。

对我来说,答案是在 NSManagedObject 子类中我已经覆盖了:

- (void)willChangeValueForKey:(NSString *)inKey withSetMutation:(NSKeyValueSetMutationKind)inMutationKind usingObjects:(NSSet *)inObjects

- (void)didChangeValueForKey:(NSString *)inKey withSetMutation:(NSKeyValueSetMutationKind)inMutationKind usingObjects:(NSSet *)inObjects

这会阻止将正确的通知发送到处理自动反向关系的父类 (NSManagedObject)。

【讨论】:

  • 这对我也有帮助。记住也要对 -(void)didChangeValueForKey:(NSString *)key; (纯值)
  • Suuuch 在我的代码库中出现了一个愚蠢的错误,但这个答案指出了问题所在,所以你得到了我的支持。谢谢先生。
【解决方案2】:

如果您要覆盖这些方法中的任何一个,我发现了错误

// KVO change notification
- (void)willChangeValueForKey:(NSString *)key;
- (void)didChangeValueForKey:(NSString *)key;
- (void)willChangeValueForKey:(NSString *)inKey withSetMutation:(NSKeyValueSetMutationKind)inMutationKind usingObjects:(NSSet *)inObjects;
- (void)didChangeValueForKey:(NSString *)inKey withSetMutation:(NSKeyValueSetMutationKind)inMutationKind usingObjects:(NSSet *)inObjects;

这会导致 NSManagedObject 不能正常工作,并且无法正确设置关系

Apple 文档:您不得覆盖这些方法。

【讨论】:

    【解决方案3】:

    如果您要对托管对象进行子类化,不应该有自动生成的多对多关系方法吗?所以你只需要打电话:

    [aObject addBObject:bObject];
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 2012-09-07
    • 2017-10-04
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多