Сохранение и загрузка основных данных на несколько объектов - PullRequest
1 голос
/ 11 марта 2011

Основные данные Noob здесь.

У меня есть проект, он без проблем сохраняет данные в одном объекте.Однако, поскольку у объекта слишком много свойств (более 100), он получает предупреждение о том, что мне нужно его нормализовать.Итак, я создаю вторую сущность для хранения большего количества данных с отношениями To-One в обоих направлениях.

Проблема в том, что когда я пытаюсь сохранить данные, данные сохраняются и перезагружаются в первую сущность, но не будутперезагрузить со второго.Я должен пропустить что-то простое.

Вот код:

//ViewDidLoad
    - (void)viewDidLoad
{
    if (managedObjectContext == nil) {
        managedObjectContext = [(CoreDataStuffAppDelegate *) [[UIApplication sharedApplication] delegate] managedObjectContext];
        NSLog(@"After managedObjectContext: %@", managedObjectContext);
    }

   // [self addRecord];
    [super viewDidLoad];

    if ([self fetchData]) {
        NSLog(@"after self fetchData patientArray count is %i", [parentArray count]);
        if ([parentArray count] == 1) {
            Parent *parentInfo = (Parent *)[parentArray objectAtIndex:0];
            parentItem1.text = parentInfo.Mother;
            NSLog(@"fetching on load %i", [parentArray count]);

            //Try 1:  just going after the relationship route (FAIL:  cuz data wont store.  stays null)
         //   childItem1.text = parentInfo.ParentToChild.Kid;

              // Try 2:  going the route of directly talking to the second entity
            childItem1.text = child.Kid;
        }
    }

// Save Record
    - (void)saveRecord{
    if (managedObjectContext == nil) {
        NSLog(@"there is no context, arrg");

    }
    NSLog(@"array count is %i", [parentArray count]);
    if ([parentArray count] == 1) {
        NSManagedObjectContext *context = managedObjectContext;//[parent managedObjectContext];
        NSLog(@"context 1 is: %@", context);

        Parent *parentInfo = (Parent *)[parentArray objectAtIndex:0];
        parentInfo.Mother = parentItem1.text;
        NSLog(@"data says: %@", parentInfo.Mother);
        NSLog(@"text syas: %@", parentItem1.text);

        // Try 1, save it through the child relationship thing.  (failed)
    //    parentInfo.ParentToChild.Kid = childItem1.text;
    //    NSLog(@"childSave says: D: %@ T: %@", parentInfo.ParentToChild.Kid , childItem1.text);

       // Try 2.  from Resipeas app
        if (!child) {
            self.child = [NSEntityDescription insertNewObjectForEntityForName:@"Child" inManagedObjectContext:context];
            [parent addChildObject:child];
            NSLog(@"I hit the child");

        }
        child.Kid = childItem1.text;
        NSLog(@"1: childSave says: D: %@ T: %@", parentInfo.ParentToChild.Kid , childItem1.text);
        NSLog(@"2: childSave says: D: %@ T: %@", child.Kid , childItem1.text);



        NSError *error = nil;
        if (![context save:&error]) {
            NSLog(@"context 2 is: %@", context);
            NSLog(@"major fail %@", [error localizedDescription]);
         //   abort();
        }
    }
    NSLog(@"saving stuff");

}

// FetchData
- (BOOL)fetchData {
    NSLog(@"doing the fetch");
    BOOL returnResult = FALSE;
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

    if (managedObjectContext == nil) 
    { 
        NSLog(@"ok making a new managed object context");
        managedObjectContext = [(CoreDataStuffAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    }

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Parent" inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];
    [fetchRequest setFetchBatchSize:1];
    NSError *error;
    NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];
    if (mutableFetchResults == nil) {
        NSLog(@"Fetching Error");
    } else {
        [self setParentArray:mutableFetchResults];
        returnResult = TRUE;
        NSLog(@"Fetching went well");
    }

    [mutableFetchResults release];
    [fetchRequest release];

    return (returnResult);
}

1 Ответ

2 голосов
/ 11 марта 2011

Хорошо, во-первых, я думаю, у вас здесь есть концептуальная проблема, потому что я никогда не видел необходимости в сущности со 100 атрибутами.Большинство сущностей имеют около полдюжины атрибутов, и я думаю, что самое большее, что я когда-либо видел, было около 20.

Базовые данные - это, прежде всего, система управления графами объектов, с опорой на постоянство.Он предназначен для реализации модельного уровня конструкции Model-View-Controller (MVC).Таким образом, Core Data в первую очередь касается данных моделирования, а не их хранения.

Объекты предназначены для представления какого-либо реального объекта, условия или события.Существует не так много реальных вещей, которые имеют 100 атрибутов.Например, вы хотите сделать детальную модель человека.Вам нужны такие вещи, как имя, фамилия, адрес (с атрибутами для каждого компонента адреса), водительские права № и дата выдачи, место работы с адресом, номер социального страхования и т. Д. Если вы пытались объединить все это в один Person сущность, вы можете получить десятки атрибутов.Однако, если вы внимательно посмотрите на данные, которые вы моделируете, и на взаимосвязи внутри данных, вы заметите, что в реальном мире адреса, водительские права, места работы и т. Д. На самом деле не атрибуты реальных людей, а скорее другие реальные объекты. относится к реальным людям.Следовательно, лучшим подходом было бы разделение атрибутов для этих объектов на отдельные объекты и создание связей с объектом Person.Это делает модель более реалистичной.В конце концов, более одного человека могут жить по одному адресу или работать в одном месте.

Итак, вам, вероятно, нужно начать все с нуля и переосмыслить дизайн модели данных.

Убедитесь, что вы понимаете разницу между сущностями и управляемыми объектами.Объекты являются абстрактными и служат просто для определения ключей, типов значений и отношений для управляемых объектов.Объекты - это управляемые объекты, а классы - экземплярам.

У вас есть две другие проблемы:

(1) Вы можете использовать формы доступа к синтаксису с точками, например parentInfo.ParentToChild.Kid, если вы определили собственные подклассы NSManagedObject для ваших сущностей.В противном случае вы используете универсальные экземпляры NSManagedObject и должны использовать методы ключ-значение, например [parent setvalue:forKey].

(2) Извлечение возвращает только объекты одного объекта.Так что если у вас есть родительский объект и дочерний объект.Каждый выбор возвращает экземпляры Parent или Child, но не оба одновременно (если они оба не наследуют сущность выборки).

...