Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c CoreData—如何使实体强制与自身建立父子关系?_Objective C_Core Data_Parent Child - Fatal编程技术网

Objective c CoreData—如何使实体强制与自身建立父子关系?

Objective c CoreData—如何使实体强制与自身建立父子关系?,objective-c,core-data,parent-child,Objective C,Core Data,Parent Child,我想创建一个名为“Employees”的CoreData实体,有些“Employees”可以有一个直线经理(或老板) 在基本pseducode中,可以描述为: emp_id (PRIMARY KEY) emp_name emp_parent_id (INT *but optional as some people may not have line managers*) 我可以使用的另一个例子是“articles”,一篇文章可以有一个父“Article”,当然不是所有的文章都有一个父文章 我面

我想创建一个名为“Employees”的CoreData实体,有些“Employees”可以有一个直线经理(或老板)

在基本pseducode中,可以描述为:

emp_id (PRIMARY KEY)
emp_name
emp_parent_id (INT *but optional as some people may not have line managers*)
我可以使用的另一个例子是“articles”,一篇文章可以有一个父“Article”,当然不是所有的文章都有一个父文章

我面临的问题是,我不确定如何在核心数据中表示这一点,甚至不确定它是否能够处理这些事情

在Core Data Model maker中,我创建了一个名为“Employee”的实体,然后创建一个指向自身的关系,并选中可选项,确保没有级联删除或反向关系

但我不确定这是否是正确的方法。我可以将核心数据实体作为可选父实体与其自身关联吗


谢谢。

当然可以。但是你也应该添加反向关系,这样你就可以找出一个经理所管理的所有员工

您的员工实体应如下所示:

  • 关系经理:至一,可选,反向:managedEmployees
  • 关系管理员工:对多,可选,反向:管理者

    • 当然可以。但是你也应该添加反向关系,这样你就可以找出一个经理所管理的所有员工

      您的员工实体应如下所示:

      • 关系经理:至一,可选,反向:managedEmployees
      • 关系管理员工:对多,可选,反向:管理者

      我已经能够用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]
      
      尽管我仍在学习核心数据的基础知识


      @斯文-我不能强迫多对多的关系,它总是给我多对多。因此,目前我只使用1对1关系。

      我已经能够使用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]
      
      尽管我仍在学习核心数据的基础知识


      @斯文-我不能强迫多对多的关系,它总是给我多对多。所以目前我只是使用一对一的关系。

      是的,我同意;它给了我一个警告,如果我试图建立一个没有反向关系的父母关系。你如何建立多对多关系,每当我尝试它时,它总是保持多对多关系?Pic:您需要添加两个关系。您只需将parent_emp设置为它自己的反向关系。这对这个没有意义。你还应该认真考虑如何命名你的属性和关系。通常的方法是用CamelCase而不是下划线来分隔单词。哦,谢谢,我感谢你的帮助。我只是不确定我该如何处理核心数据以及如何建立关系;但你的形象和详细的讨论帮了大忙。我还有一个问题——测试父子关系是否有效的最佳方法是什么?我已经做了一些基本的NSlog,与下面的答案类似;然后我在终端中用SQLite检查它;这一切似乎都在起作用——我可能需要更多地测试它,但我还是很高兴;它给了我一个警告,如果我试图建立一个没有反向关系的父母关系。你如何建立多对多关系,每当我尝试它时,它总是保持多对多关系?Pic:您需要添加两个关系。您只需将parent_emp设置为它自己的反向关系。这对这个没有意义。你还应该认真考虑如何命名你的属性和关系。通常的方法是用CamelCase而不是下划线来分隔单词。哦,谢谢,我感谢你的帮助。我只是不确定我该如何处理核心数据以及如何建立关系;但你的形象和详细的讨论帮了大忙。我还有一个问题——测试父子关系是否有效的最佳方法是什么?我已经做了一些基本的NSlog,与下面的答案类似;然后我在终端中用SQLite检查它;这一切似乎都在起作用——我可能需要更多的测试,但我还是很高兴。谢谢,这很有帮助。我已经能够在xcode中复制您的图片:谢谢,这很有帮助。我已经能够在xcode中复制您的图片: