1

alt textдобавить <Key> Object против insertNewObjectForEntityForName Основные Отношения данных

Привет,

Хотя у меня есть большой опыт в разработке баз данных, я с трудом концептуализации, связывающие отношения в 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 отдельно в другой части приложения, поэтому мне нужно установить отношение «один» к «События». Здесь я не слишком уверен. Должны ли быть шаги?

// 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

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

Этап C: self.eventLocationsObject, вероятно, должен быть объявлен как EventLocations *.

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

+0

Предупреждение компилятора находится в стадии C: –

+0

OK. Просто чтобы понять это лучше: то, что я делаю, это вставка нового объекта в сущность (шаг A), а затем добавление объекта в набор в отношении одной сущности (шаг C)? –

+0

мой комментарий к шагу C должен исправить предупреждение компилятора. да, вы добавляете новый объект в контекст, а затем добавляете его в отношение (задано) по мере необходимости –

Смежные вопросы