Как правильно установить отношения в Core Data при использовании setValue и данных уже существует

95
6

Скажем, у меня есть два объекта: Статьи и Категории со многими отношениями между ними. Для этого примера все необходимые категории уже добавлены в хранилище данных. При переходе по данным, которые содержат изменения для статей, существует информация о соотношении категорий, которая должна быть сохранена.


Я планировал использовать метод -setValue в классе Article, чтобы установить такие отношения:


- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
if([key isEqualToString:@"categories"]){
NSLog(@"trying to set categories...");
}
}

Проблема заключается в том, что value не является Category, а просто строкой (или массивом строк), содержащей заголовок категории. Я мог бы, конечно, сделать поиск в этом методе для каждой категории и назначить его, но это кажется неэффективным при обработке целого ряда статей сразу. Другой вариант - заполнить массив всех возможных категорий и просто фильтровать, но мой вопрос заключается в том, где хранить этот массив? Должен ли это быть классным методом на Article? Есть ли способ передать дополнительные данные методу -setValue? Есть ли другой, лучший вариант для установки отношений, о которых я не думаю?


Спасибо за вашу помощь.

спросил(а) 2010-06-09T07:29:00+04:00 10 лет, 1 месяц назад
1
Решение
87

Почему вы реализуете setValue: forKey:? Вы должны иметь отношения между этими двумя объектами, которые настроены как многие для многих, и работать с отношениями напрямую. Оказалось, что вы делаете это с трудом.


Какова ваша конечная цель с помощью этого кода?


Update

Если вы правильно поняли, у вас есть blob данных JSON, и вы хотите превратить это в граф объектов, и он соответствует этому графу объектов правильно? Если это так, посмотрите код, который я написал в этом другом ответе:


JSON и основные данные на iPhone


В этом ответе я покажу, как рекурсивно построить и деконструировать граф NSManagedObject в структуру JSON и из нее. Это немного легче, чем путь, по которому вы сейчас уходите.

ответил(а) 2010-06-10T00:35:00+04:00 10 лет, 1 месяц назад
68

Похоже, что у вас определено соотношение 1:1, поэтому вы пытаетесь сказать, что статья принадлежит одной и только одной категории.


Когда вы заполняете один объект, вам может понадобиться создать другое; поэтому, когда статья создается, вам нужно будет проверить свой основной хранилище данных для объекта с правильным типом, и если он не существует, вы его создаете. Когда у вас есть объект, ранее существовавший или только что созданный, вы либо назначаете (отношение одного) его к категории ivar отношений, либо (отношение многих) добавьте его в NSSet *, выражающую взаимосвязь.

Итак, да, вам нужно искать и назначать фактический объект, так как вы должны создать отношение к объекту в контексте управляемого объекта, а если оно не существует, оно должно быть создано до того, как это можно сделать.

ответил(а) 2010-06-09T07:55:00+04:00 10 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема