Как правильно установить отношения в Core Data при использовании setValue и данных уже существует
Скажем, у меня есть два объекта: Статьи и Категории со многими отношениями между ними. Для этого примера все необходимые категории уже добавлены в хранилище данных. При переходе по данным, которые содержат изменения для статей, существует информация о соотношении категорий, которая должна быть сохранена.
Я планировал использовать метод -setValue
в классе Article
, чтобы установить такие отношения:
- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
if([key isEqualToString:@"categories"]){
NSLog(@"trying to set categories...");
}
}
Проблема заключается в том, что value
не является Category
, а просто строкой (или массивом строк), содержащей заголовок категории. Я мог бы, конечно, сделать поиск в этом методе для каждой категории и назначить его, но это кажется неэффективным при обработке целого ряда статей сразу. Другой вариант - заполнить массив всех возможных категорий и просто фильтровать, но мой вопрос заключается в том, где хранить этот массив? Должен ли это быть классным методом на Article
? Есть ли способ передать дополнительные данные методу -setValue
? Есть ли другой, лучший вариант для установки отношений, о которых я не думаю?
Спасибо за вашу помощь.
Почему вы реализуете setValue: forKey:? Вы должны иметь отношения между этими двумя объектами, которые настроены как многие для многих, и работать с отношениями напрямую. Оказалось, что вы делаете это с трудом.
Какова ваша конечная цель с помощью этого кода?
Update
Если вы правильно поняли, у вас есть blob данных JSON, и вы хотите превратить это в граф объектов, и он соответствует этому графу объектов правильно? Если это так, посмотрите код, который я написал в этом другом ответе:
JSON и основные данные на iPhone
В этом ответе я покажу, как рекурсивно построить и деконструировать граф NSManagedObject в структуру JSON и из нее. Это немного легче, чем путь, по которому вы сейчас уходите.
Похоже, что у вас определено соотношение 1:1, поэтому вы пытаетесь сказать, что статья принадлежит одной и только одной категории.
Когда вы заполняете один объект, вам может понадобиться создать другое; поэтому, когда статья создается, вам нужно будет проверить свой основной хранилище данных для объекта с правильным типом, и если он не существует, вы его создаете. Когда у вас есть объект, ранее существовавший или только что созданный, вы либо назначаете (отношение одного) его к категории ivar отношений, либо (отношение многих) добавьте его в NSSet *, выражающую взаимосвязь.
Итак, да, вам нужно искать и назначать фактический объект, так как вы должны создать отношение к объекту в контексте управляемого объекта, а если оно не существует, оно должно быть создано до того, как это можно сделать.