Обратная связь базовых данных не установлена - PullRequest
12 голосов
/ 31 мая 2011

У меня есть две сущности, которые я назову A и B. Они настроены на отношения To-Many в обоих направлениях, поэтому A.myBs и B.myAs являются NSSets.

Вот моя странная проблема.

Когда я добавляю 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) Я проверил, перепроверил и ослеп, глядя на мои пользовательские объекты NSManagedObject, но они выглядят хорошо - объявлены динамически, NSSet, нет конфликтующих сеттеров / геттеров ... и т. Д.

Любая помощь или предложения по отладке будут с благодарностью. Спасибо!

Ответы [ 3 ]

7 голосов
/ 23 января 2012

У меня просто была такая же проблема, поэтому я и увидел этот вопрос.Может быть, мое решение поможет некоторым людям в такой же ситуации.

Для меня ответ был таков: в подклассе NSManagedObject я переопределил:

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

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

Это препятствует отправке правильных уведомлений.в родительский класс (NSManagedObject), который обрабатывает автоматические обратные отношения.

2 голосов
/ 29 февраля 2016

Я обнаружил ошибку, если вы переопределите любой из этих методов

// 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документация: Вы не должны переопределять эти методы.

0 голосов
/ 02 июня 2011

Если вы создаете подклассы управляемого объекта, разве не должно быть автоматически сгенерированных методов отношения ко многим? Чтобы вам просто нужно было позвонить:

[aObject addBObject:bObject];
...