Сгенерированный автоматически код для обратной связи 1-ко-многим в базовой модели данных - PullRequest
0 голосов
/ 27 июля 2011

Я создал две сущности в базовой модели данных (в данном примере Courier и Occupation) и создал обратную связь между ними, что также привело к раздавлению в xcode .После этого я установил отношения как один курьер для многих профессий и создал классы.

Класс занятий был создан пустым, но класс курьера был заполнен следующим кодом:

- (void)addOccupationsObject:(NSManagedObject *)value {    
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
    [self willChangeValueForKey:@"occupations" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [[self primitiveValueForKey:@"occupations"] addObject:value];
    [self didChangeValueForKey:@"occupations" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [changedObjects release];
}

- (void)removeOccupationsObject:(NSManagedObject *)value {
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
    [self willChangeValueForKey:@"occupations" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
    [[self primitiveValueForKey:@"occupations"] removeObject:value];
    [self didChangeValueForKey:@"occupations" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
    [changedObjects release];
}

- (void)addOccupations:(NSSet *)value {    
    [self willChangeValueForKey:@"occupations" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value];
    [[self primitiveValueForKey:@"occupations"] unionSet:value];
    [self didChangeValueForKey:@"occupations" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value];
}

- (void)removeOccupations:(NSSet *)value {
    [self willChangeValueForKey:@"occupations" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value];
    [[self primitiveValueForKey:@"occupations"] minusSet:value];
    [self didChangeValueForKey:@"occupations" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value];
}

У меня есть два вопроса по этому поводу:

  1. Что именно он делает?
  2. Гарантирует ли это согласованность этой модели?(Я знаю, что так и должно быть, но после сбоя я не уверен, что логика xcode при создании этого кода была правильной).
  3. Почему класс занятия был создан пустым?

1 Ответ

1 голос
/ 28 июля 2011
  1. Что именно он делает? Если я понял этот вопрос, созданные методы - единственный способ добавить Профессии курьеру. Поскольку, например, вы не можете создать стандартный NSSet, добавить к нему профессии, а затем добавить NSSet в Courier, вы получите ошибку.

  2. Гарантирует ли это согласованность этой модели? (я знаю, что так и должно быть, но после сбоя я не уверен, была ли логика xcode в генерации этого кода правильной). Каждое изменение, внесенное в контекст, не сохраняется до тех пор, пока вы явно не вызовете соответствующий метод, поэтому да, должно быть согласованным. Помните, что если вы измените xcdatamodel, вам придется обновить или удалить файл sqllite, созданный ранее.

  3. Почему класс занятий был пуст? Если он действительно пустой, значит что-то не так. Но, вероятно, он не пустой, он должен иметь хотя бы атрибуты, а затем атрибут типа Courier, который является вашей обратной связью. В реализации Occupation.m вы должны найти множество @dynamic, которые сообщают компиляторам проходить мимо, потому что во время выполнения будет предоставлена ​​правильная реализация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...