核心数据实体关系不会在启动之间保存

我正在编写一个应用程序,它有四个主要的实体,都通过关系链接。 有些是一对一的,有些是一对多的。 在初始加载时,三个实体从存储在本地的XML文件中加载它们的数据到一个应用程序,其中一个实体从网上下载一个XML并从中加载它的数据。 当应用程序加载时,它会执行检查,以查看每个文件的数据是否比当前的数据更新,如果是,则将使用相应文件中的数据replace该实体中的所有当前数据。

作为我的debugging过程中的一部分,我一直在强制删除所有数据。 当调用delete函数并在应用程序启动时加载所有数据时,应用程序将运行得非常漂亮,所有实体和关系的行为都与应用程序完全相同。 但是,当我删除对delete函数的调用,并执行检查并尝试从存储的数据运行时,所有关系似乎都消失了。 在debugging这个时候,我发现所有的实体都包含了所有的常规数据,他们只是没有关系。 我无法弄清楚为什么世界上的关系是保存在第一次加载,但不保留所有数据不重新导入。

我会想象一些代码将有助于任何人debugging,但是,我不知道我应该包括多less。 所以,我将开始只包括数据加载类中调用的一个方法。 如果还有什么可以帮助,请让我知道。 很感谢任何forms的帮助。

更新代码:2/25/11(根据build议 – 问题依然存在)更新代码:2/25/11 – 解决问题

- (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; } 

更新:2011年5月25日

每个请求我发布几个屏幕截图。

1)这是我的应用程序加载后得到的所有数据已被删除和关系的机智

数据正确加载

2)这是我的应用程序再次运行时没有首先删除和重新加载数据。 底部的标签由其中一个实体创build,标题有点不同。 发生这种情况是因为与DisplayType的关系不存在,它不知道要加载的视图控制器的types,也不知道该选项卡使用哪个图标。

加载的数据 - 关系丢失

通常情况下,您不需要明确设置关系的双方。 在处理一对多关系时,一次向集合中添加一个实体可能更安全,而不是一次设置集合。 所以,而不是:

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

我将通过featureSections Set循环,并将每个对象逐个添加到Feature实体的section关系中,例如:

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

我希望这有帮助…

否则,苹果文档中的这一部分可能是有趣的。