#iphone #objective-c #core-data
#iPhone #objective-c #core-data
Вопрос:
В одном из моих объектов core data у меня есть отношение «один ко многим» с другим объектом. Допустим, у моего семейного объекта есть отношение «ко-многим» с person.
Я могу без проблем создавать семьи и отдельных лиц. но когда я делаю:
self.myFamily.people = [NSSet setWithArray:myPersonArray];
Похоже, что для отношения «people» не назначен набор.
В настоящее время я переназначаю некоторый код из viewcontrollers в singleton. Может ли это иметь какое-либо отношение к этому? Я могу сохранить все другие объекты, я могу создавать и удалять управляемые объекты, я просто не могу назначить набор объектов для связи!
Ответ №1:
Есть несколько причин, по которым это может не сработать. Во-первых, если вы пытаетесь сделать это в инициализаторе объекта, он неправильно установит значение. При вызове инициализатора объект еще не был добавлен в контекст, поэтому установка значения может не иметь никакого эффекта. Во-вторых, Apple не рекомендует устанавливать связь «ко-многим» напрямую (извините, я не могу найти документацию для этого утверждения, но там сказано что-то вроде: если вы делаете это слишком часто, это может перестать работать). Вместо этого вам следует изменить изменяемый набор, который он создает автоматически, либо с помощью динамически создаваемых средств доступа, либо с помощью значения, возвращаемого из mutableSetValueForKey:
.
[self.myFamily addPeople:[NSSet setWithArray:myPersonArray]];
или
[[self.myFamily mutableSetValueForKey:@"people"] addObjectsFromArray:myPersonArray];
или, поскольку вы хотите изменить весь набор
[[self.myFamily mutableSetValueForKey:@"people"] setSet:[NSSet setWithArray:myPersonArray]];
Вы должны использовать mutableSetValueForKey:
вместо объекта set, возвращаемого средством доступа, потому что объект, возвращаемый средством доступа, не будет вызывать уведомления KVC, но объект из mutableSetValueForKey:
будет.
Комментарии:
1. Я не понимаю, почему, но это тоже не работает. Итак, у меня есть класс ‘Family’ с @property (неатомный, сохранить) NSSet * people; Но я не могу установить набор (он остается пустым). Шаблон был достаточно любезен, чтобы предоставить мне такие методы, как: — (void)addPeople:(NSSet *)value { методы. Но, похоже, их использование также не заполняет набор. Нужно ли мне инициализировать мои отношения «до мая» или что происходит? Или после того, как я установил Set, мне нужно сделать что-нибудь еще? не должен? Я сохраняю контекст, но семейный managedObject уже существует, поэтому он должен быть готов к использованию.
Ответ №2:
Наиболее вероятной причиной этой ошибки, о которой вы сообщаете, является попытка добавить набор объектов неправильного класса. Вы можете добавлять объекты только той сущности / класса, которая определена для связи в модели данных.
Итак, если у вас есть такая модель данных:
Family{
name:string
people<-->>Person.family
}
Person{
name:string
family<<-->Family.people
}
… и у вас есть подклассы NSManagedObject FamilyMO
и PersonMO
, тогда вы можете назначить только набор PersonMO
объектов для Family.people
отношения. Если вы пытались назначить набор, подобный этому:
NSSet *badSet=[NSSet setWithObjects:PersonMO1, PersonMO2, FamilyMO1, PersonMO2,nil];
aFamilyMO.people=badSet;
… это привело бы к сбою и IIRC, это было бы сделано беззвучно.
Комментарии:
1. Я понял это. В середине выполнения этого перемещения кода в singleton я вызывал методы в неправильном порядке, поэтому, когда я вызывал функцию для добавления людей в мою семью, семья еще не была выделена. Это также причина, по которой все остальное работало — я вызывал другие методы после добавления семейства в контекст. Хотя я ожидал ошибки во время выполнения, но опять же, я присваивал значение nil … что совершенно нормально — О! Я поставлю вам отметку об ошибке без предупреждения 😉