add <Key>Object vs insertNewObjectForEntityForName Core Data Relationships - PullRequest
1 голос
/ 09 сентября 2010

alt text

Привет,

Хотя у меня большой опыт разработки баз данных, мне трудно осмыслить взаимосвязи в Core Data. Насколько я понимаю, отношение многие - это NSSet, прикрепленный к одному файлу. После прочтения документации я понял ее часть и заставил ее работать при первом импорте в моем коде ниже.

У меня есть модель данных, в которую я выполняю два отдельных импорта, используя XMLParser. Первый импорт загружает События и Категории из одного и того же XML-файла в рамках одного импорта следующим образом:

if (thisTagIsForOneTable) {
            // Insert object for the one-entity (Events)
    self.eventsObject = [NSEntityDescription insertNewObjectForEntityForName:@"Events" inManagedObjectContext:xmlManagedObjectContext];
    return;
}   

if (thisTagIsForManyTable) {
            // Insert object for many-entity (EventCategories)
    self.categoriesObject = [NSEntityDescription insertNewObjectForEntityForName:@"EventCategories" inManagedObjectContext:xmlManagedObjectContext];
    return;
}

    ......
    // Set attribute values depending upon whether the tag is for the one-entity or the many-entity.
[self.xxxObject setValue:trimmedString forKey:attributeName];
    ......

    // Set the relationship. This works great!
if (thisTagIsForManyTable) {
    NSMutableSet *manyRecordSet = [self.eventsObject  mutableSetValueForKey:@"categories"]; // My relationship name.
    [manyRecordSet addObject:self.categoriesObject];

    }

    // Save the context. Voila.

Выше работает нормально. Второй импорт загружает EventLocations отдельно в другой части приложения, поэтому мне нужно установить отношение «один к одному» с Events. Это где я не слишком уверен. Должны ли быть шаги?

// Step A) Create (insert) new EventLocations object.
    self.eventLocationsObject = [NSEntityDescription insertNewObjectForEntityForName:@"EventLocations" inManagedObjectContext:xmlManagedObjectContext];



    // Step B) Locate and get a reference to the the related one-entity's object (Events) by ID?  I have a custom class for Events. 
   // This seems to work but I'm taking a performance hit and getting a compiler warning below. The method returnObjectForEntity does a query and returns an NSManagedObject. Is this correct?
    Events *event = (Events *)[self returnObjectForEntity:@"Events" withID:[oneRecordObject valueForKey:@"infIDCode"]];


    // Step C) Set the relationship to the Events entity. 
if (event) {

    [event addLocationsObject:self.eventLocationsObject];

        // Compiler warning: incompatible Objective-C types 'struct NSManagedObject *', expected 'struct EventLocations *' when passing argument 1 of 'addLocationsObject:' from distinct Objective-C type


}
    // Save the context.

Я не слишком уверен насчет шагов B и C. Буду признателен за любую помощь. Спасибо.

1 Ответ

1 голос
/ 09 сентября 2010

Шаг B: Пожалуйста, сообщите нам предупреждение компилятора. Чтобы ускорить процесс, вы можете создать кеш (NSDictionary) со всеми событиями и их @ "infIDCode" в качестве ключей перед началом импорта. Это ускорит процесс до тех пор, пока вы можете быть уверены, что никакие события не будут добавлены / удалены / изменены на этапе импорта.

Шаг С: Вероятно, self.eventLocationsObject должен быть объявлен как EventLocations *.

В целом ваш импорт должен работать таким образом

...