La relación de la entidad de datos principales no ahorra entre lanzamientos

Estoy escribiendo una aplicación que tiene cuatro entidades principales que están vinculadas a través de las relaciones. Algunos son uno a uno, algunos son uno a muchos. Tras la carga inicial, tres de las entidades cargan sus datos de los files XML almacenados localmente en la aplicación y una de las entidades descarga un XML de la web y carga sus datos. Cuando la aplicación lo carga, realiza una comprobación para ver si los datos de cada uno de estos files son más recientes de lo que actualmente tiene y, de ser así, replaceá todos los datos actuales en esa entidad con datos del file apropiado.

Como parte de mi process de debugging durante la escritura he estado forzando la eliminación de todos los datos. Cuando se llama a la function de eliminación y todos los datos se cargan al iniciar la aplicación, la aplicación funciona perfectamente y todas las entidades y relaciones se comportan exactamente como deberían. Sin embargo, cuando elimino la llamada a la function de eliminación y realiza las comprobaciones e intenta ejecutar desde los datos que ha almacenado, todas las relaciones parecen desaparecer. Al depurar esto, he descubierto que todas las entidades contienen todos los datos regulares que se supone que tienen, simplemente ya no tienen las relaciones. No puedo entender por qué en el mundo las relaciones se guardan en la primera carga, pero no se conservan cuando no se reimportan todos los datos.

Me imagino que algún código sería útil para cualquier debugging, sin embargo, no estoy seguro de cuánto debo include. Entonces, comenzaré por include solo uno de los methods llamados en la class de carga de datos. Si algo más ayudara, por favor hágamelo saber. Cualquier ayuda es muy apreciada.

CÓDIGO ACTUALIZADO: 25/02/11 (Basado en Sugerencias – El problema aún existe) CÓDIGO ACTUALIZADO: 25/02/11 – Problema resuelto

- (NSArray *) loadFeatures { if ([self checkForUpdate:@"Features"]) { [self deleteAllObjects:@"Features"]; NSString *filePath = [self dataFilePath:FALSE withResourceName:@"Features"]; NSData *xmlData = [[NSMutableData alloc] initWithContentsOfFile:filePath]; NSError *error; GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:&error]; NSArray *featureElements = [doc.rootElement elementsForName:@"FEATURE"]; NSMutableSet *featureSections = [[NSMutableSet alloc] init]; for (GDataXMLElement *featureElement in featureElements) { NSString *featureName = nil; NSNumber *featureSecure = nil; NSNumber *featureID = nil; NSNumber *featureSortKey = nil; DisplayTypes *featureDisplayType = nil; NSArray *names = [featureElement elementsForName:@"NAME"]; if (names.count > 0) { GDataXMLElement *firstName = (GDataXMLElement *) [names objectAtIndex:0]; featureName = firstName.stringValue; } else continue; NSArray *secures = [featureElement elementsForName:@"SECURE"]; if (secures.count > 0) { GDataXMLElement *firstSecure = (GDataXMLElement *) [secures objectAtIndex:0]; featureSecure = [NSNumber numberWithInt:firstSecure.stringValue.intValue]; } else continue; NSArray *featureIDs = [featureElement elementsForName:@"FEATUREID"]; if (featureIDs.count > 0) { GDataXMLElement *firstFeatureID = (GDataXMLElement *) [featureIDs objectAtIndex:0]; featureID = [NSNumber numberWithInt:firstFeatureID.stringValue.intValue]; } NSArray *featureSortKeys = [featureElement elementsForName:@"SORTKEY"]; if (featureSortKeys.count > 0) { GDataXMLElement *firstSortKey = (GDataXMLElement *) [featureSortKeys objectAtIndex:0]; featureSortKey = [NSNumber numberWithInt:firstSortKey.stringValue.intValue]; } NSArray *featureDisplays = [featureElement elementsForName:@"DISPLAYTYPEID"]; if (featureDisplays.count > 0) { GDataXMLElement *firstFeatureDisplay = (GDataXMLElement *) [featureDisplays objectAtIndex:0]; for (DisplayTypes *thisDisplayType in self.displayTypes) { if (thisDisplayType.displayTypeID == [NSNumber numberWithInt:firstFeatureDisplay.stringValue.intValue]) { featureDisplayType = thisDisplayType; } } } NSArray *sectionElements = [featureElement elementsForName:@"SECTIONS"]; for (GDataXMLElement *sectionElement in sectionElements) { NSArray *sectionIDs = [sectionElement elementsForName:@"SECTION"]; for (GDataXMLElement *sectionID in sectionIDs) { NSArray *thisSectionIDs = [sectionID elementsForName:@"SECTIONID"]; if ([thisSectionIDs count]) { GDataXMLElement *thisSectionID = (GDataXMLElement *) [thisSectionIDs objectAtIndex:0]; for (Sections *thisSection in self.sections) { if ([thisSection.sectionID isEqualToNumber:[NSNumber numberWithInt:thisSectionID.stringValue.intValue]]) { [featureSections addObject:thisSection]; } } } } } NSManagedObjectContext *context = [self managedObjectContext]; NSManagedObject *featureInfo = [NSEntityDescription insertNewObjectForEntityForName:@"Features" inManagedObjectContext:context]; [featureInfo setValue:featureName forKey:@"name"]; [featureInfo setValue:featureSecure forKey:@"secure"]; [featureInfo setValue:featureID forKey:@"featureID"]; [featureInfo setValue:featureSortKey forKey:@"sortKey"]; [featureInfo setValue:featureDisplayType forKey:@"display"]; [[featureInfo mutableSetValueForKey:@"section"] unionSet:featureSections]; NSError *error; if (![context save:&error]) { NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]); } [[self.managedObjectContext objectWithID:featureDisplayType.objectID] addFeatureObject:featureInfo]; [self.managedObjectContext save:&error]; [featureSections removeAllObjects]; } [xmlData release]; [doc release]; [featureSections release]; } NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"Features" inManagedObjectContext:[self managedObjectContext]]; [fetchRequest setEntity:entity]; NSError *error; NSArray *featureArray = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; [fetchRequest release]; return featureArray; } 

ACTUALIZACIÓN: 25/05/2011

Por request, estoy publicando un par de capturas de pantalla.

1) Esto es lo que obtengo cuando la aplicación se carga después de que todos los datos han sido eliminados y las relaciones están en contacto

Datos cargados correctamente

2) Esto es lo que obtengo cuando la aplicación se ejecuta de nuevo sin primero eliminar y volver a cargar los datos. Las tabs en la parte inferior son creadas por una de las entidades, y se titulan un poco diferentes. Esto sucede porque la relación con DisplayType no está presente y no sabe qué tipo de controller de vista cargar y no sabe qué ícono utilizar para la pestaña.

Datos cargados: faltan las relaciones

Normalmente, no necesitará establecer explícitamente ambos lados de una relación. Cuando se trata de una relación de muchos, probablemente sea más seguro agregar una entidad a la vez en la colección, en lugar de configurar la colección de una vez. Entonces, en lugar de:

 [featureInfo setValue:[NSSet setWithSet:featureSections] forKey:@"section"]; 

Me gustaría recorrer el Conjunto de featureSections y agregar cada object una por una a la relación de section de la entidad de la Feature , por ejemplo:

 for (Sections *aSection in featureSections) { // use the automatically-generated relationship mutator [featureInfo addSectionsObject:aSection]; } 

Espero que esto ayude…

De lo contrario, esta sección en la documentation de Apple puede ser de interés.