CoreData - Как заставить сущность принудительно устанавливать отношения родитель-потомок с самим собой? - PullRequest
0 голосов
/ 28 сентября 2010

Я хочу создать сущность CoreData под названием «Сотрудники», некоторые «Сотрудники» могут иметь линейного менеджера (или начальника).

В базовом псевдокоде это можно описать так:

emp_id (PRIMARY KEY)
emp_name
emp_parent_id (INT *but optional as some people may not have line managers*)

Другой пример, который я мог бы использовать, это «статьи», у статьи может быть родительская «статья», конечно, не у всех статей есть родительская статья.

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

В Core Core Model Model Maker я создаю сущность с именем «Сотрудник», а затем устанавливаю отношение, которое указывает наСам с необязательным флажком и убедитесь, что нет каскадного удаления или обратной связи.

Я не уверен, что это правильный способ сделать это.Могу ли я сделать основной объект данных относящимся к себе как к необязательному родителю?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 28 сентября 2010

Конечно, вы можете.Но вы также должны добавить обратное отношение, чтобы вы могли узнать всех сотрудников, менеджером которых является менеджер.

Ваш сотрудник должен выглядеть примерно так:

  • Менеджер по отношениям:to-one, необязательный, обратный: managedEmployees
  • Отношение управляемыхEmployees: to-many, необязательный, обратный: manager
0 голосов
/ 28 сентября 2010

Я смог сделать базовую версию с NSLog.

NSManagedObjectContext *context = [self managedObjectContext];

Employee *boss = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" 
                           inManagedObjectContext:context];
boss.name = @"Mr Big";

Employee *emp = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" 
                          inManagedObjectContext:context];
emp.name = @"Mr Smith";
emp.parent_emp = boss;

NSError *error;
if (![context save:&error])
{
NSLog(@"Error -- %@", [error localizedDescription] );
}

// Now we loop through each entity
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];

for (NSManagedObject *info in fetchedObjects) {
NSLog(@"Name: %@", [info valueForKey:@"name"]);
NSEntityDescription *parent = [info valueForKey:@"parent_emp"];
NSLog(@"Parent: %@", parent.name );
NSLog(@"------------");   
}

[fetchRequest release]

Хотя я все еще изучаю основы Core Data.

@ Свен - я не могу навязать отношения ко многим, это всегда дает мне много ко многим. Так что на данный момент я просто использую отношение 1: 1.

...