核心数据反向关系未设置

时间:2011-05-31 17:22:57

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

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

这是我奇怪的问题。

当我向我的A实体添加B时,我使用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 / getters等等。

非常感谢任何帮助或调试建议。谢谢!

3 个答案:

答案 0 :(得分:6)

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

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

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

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

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

答案 1 :(得分:1)

如果你要覆盖任何这些方法,我发现了错误

// 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文档:您不得覆盖这些方法。

答案 2 :(得分:0)

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

[aObject addBObject:bObject];