Objective c CoreData—如何使实体强制与自身建立父子关系?
我想创建一个名为“Employees”的CoreData实体,有些“Employees”可以有一个直线经理(或老板) 在基本pseducode中,可以描述为: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”,当然不是所有的文章都有一个父文章 我面
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
- 关系管理员工:对多,可选,反向:管理者
- 当然可以。但是你也应该添加反向关系,这样你就可以找出一个经理所管理的所有员工
您的员工实体应如下所示:
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中复制您的图片: