Связь сущностей основных данных не сохраняется между запусками

Я пишу приложение, которое имеет четыре основных объекта, которые связаны через отношения. Некоторые - один к одному, некоторые - один ко многим. При начальной загрузке три объекта загружают свои данные из файлов 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) Это то, что я получаю, когда приложение загружается после того, как все данные были удалены и отношения сохранены.

Data Loaded Properly

2) Это то, что я получаю, когда приложение запускается снова без предварительного удаления и перезагрузки данных. Вкладки внизу созданы одной из сущностей и имеют немного другое название. Это происходит потому, что связь с DisplayType отсутствует, и он не знает, какой тип контроллера представления загружать, и не знает, какой значок использовать для вкладки.

Data Loaded - Relationships Missing

6
задан Carl 25 May 2011 в 19:05
поделиться