我有两个实体,我称之为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等等。
非常感谢任何帮助或调试建议。谢谢!
答案 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];