Я пишу приложение, которое имеет четыре основных объекта, которые связаны через отношения. Некоторые - один к одному, некоторые - один ко многим. При начальной загрузке три объекта загружают свои данные из файлов XML, хранящихся локально, в приложение, а один из объектов загружает XML из Интернета и загружает из него свои данные. Когда приложение загружается, оно выполняет проверку, чтобы увидеть, являются ли данные из каждого из этих файлов более свежими, чем они есть в настоящее время, и, если это так, он заменит все текущие данные в этом объекте данными из соответствующего файла.
Как часть моего процесса отладки во время записи, я принудительно удалил все данные. Когда вызывается функция удаления и все данные загружаются при запуске приложения, приложение работает прекрасно, и все сущности и связи ведут себя так, как должны. Однако, когда я удаляю вызов функции удаления, и она выполняет проверки и пытается запустить ее из сохраненных данных, все взаимосвязи, кажется, исчезают. При отладке этого я обнаружил, что все сущности содержат все обычные данные, которые им положены, просто у них больше нет связей. Я не могу понять, почему отношения сохраняются при первой загрузке, но не сохраняются, когда все данные не импортируются повторно.
Я полагаю, что какой-то код будет полезен при отладке, однако я не уверен, сколько мне нужно включить. Итак, я начну с включения только одного из методов, вызываемых в классе загрузки данных. Если что-нибудь еще поможет, дайте мне знать. Приветствуется любая помощь.
ОБНОВЛЕННЫЙ КОД: 25.02.11 (на основе предложений - проблема все еще существует) ОБНОВЛЕННЫЙ КОД: 25.02.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;
}
ОБНОВЛЕНИЕ: 25.05.2011
По запросу я отправляю пару снимков экрана.
1) Это то, что я получаю, когда приложение загружается после того, как все данные были удалены и отношения сохранены.
2) Это то, что я получаю, когда приложение запускается снова без предварительного удаления и перезагрузки данных. Вкладки внизу созданы одной из сущностей и имеют немного другое название. Это происходит потому, что связь с DisplayType отсутствует, и он не знает, какой тип контроллера представления загружать, и не знает, какой значок использовать для вкладки.