Почему я не могу сохранить NSSet для отношений "ко многим" в coredata?



В одной из моих основных сущностей данных у меня есть отношение "один ко многим" с другой сущностью. Скажем, моя семейная сущность имеет отношение ко многим людям.

Я могу создавать семьи и людей без проблем. но когда я делаю a:

self.myFamily.people = [NSSet setWithArray:myPersonArray];

Похоже, что нет набора, назначенного для отношений "люди". В настоящее время я переназначаю некоторый код из viewcontrollers в синглтон. Может ли это иметь какое-то отношение к этому? Я могу сохранить все остальные объекты, я могу создать и удалить управляемые объекты я просто не могу назначить набор объектов для связи!

113   2  

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, он сделает это молча.

Есть несколько причин, по которым это может не сработать. Во-первых, если вы пытаетесь сделать это в инициализаторе объекта, он не будет правильно устанавливать значение. При вызове инициализатора объект еще не был добавлен в контекст, поэтому установка значения может не иметь никакого эффекта. Во-вторых, 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: будет.

    Ничего не найдено.

Добавить ответ:
Отменить.