首页 文章

核心数据反向关系未设置

提问于
浏览
11

我有两个实体,我称之为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

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

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

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

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

  • 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文档:您不能覆盖这些方法 .

  • 6

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

    [aObject addBObject:bObject];
    

相关问题