Обратные отношения сердечных данных не установлены
У меня есть две Entities, которые я назову A и B. Они настроены с отношениями To-Many в обоих направлениях, поэтому A.myBs и B.myAs являются NSSet.
Вот моя странная проблема.
Когда я добавляю B к моей сущности A, я делаю это, используя mutableSetValueForKey, как это:
NSMutableSet *myBSet = [myA mutableSetValueForKey:@"myBs"];
[myBSet addObject:theBtoAdd];
Это добавляет theBtoAdd к объекту A, но не добавляет обратную связь. Сохранение контекста Core Data не вызывает никаких ошибок, но мой объект A не имеет обратного B-набора. Если я выхожу из приложения, даже частичное соотношение не сохраняется.
Здесь странная часть... если я просто переключаю свой код и делаю наоборот (есть причины, по которым это сложнее сделать для моего конкретного приложения) - добавьте A в B вместо добавления B в следующим образом:
NSMutableSet *myASet = [myB mutableSetValueForKey:@"myAs"];
[myASet addObject:theAtoAdd];
Это прекрасно работает. Кстати, у меня есть много других ко многим отношениям, которые работают. Только этого нет.
Пара других вещей:
1) Моя основная модель объектов данных выглядит неплохо, но это первый новый объект, который я добавил в Xcode 4
2) Я проверил, перепроверялся и ослепнул, глядя на мои пользовательские NSManagedObjects, но они выглядят прекрасно объявленными динамическими, NSSet, не конфликтующими сеттерами/геттерами и т.д.
Приветствуются любые предложения по поддержке или отладке. Спасибо!
Ответы
Ответ 1
У меня была такая же проблема, поэтому я и увидел этот вопрос. Возможно, мое решение поможет некоторым людям в той же ситуации.
Для меня ответ заключался в том, что в подклассе NSManagedObject у меня было чрезмерное:
- (void)willChangeValueForKey:(NSString *)inKey withSetMutation:(NSKeyValueSetMutationKind)inMutationKind usingObjects:(NSSet *)inObjects
- (void)didChangeValueForKey:(NSString *)inKey withSetMutation:(NSKeyValueSetMutationKind)inMutationKind usingObjects:(NSSet *)inObjects
Это предотвращает отправку правильных уведомлений родительскому классу (NSManagedObject), который обрабатывает автоматические обратные отношения.
Ответ 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];