您如何管理和使用"多对多"核心数据关系?

Dar*_*nor 19 sqlite iphone core-data objective-c

我正在创建一个应用程序并尝试使用核心数据,因为它似乎是目标C批准的创建数据存储系统的方式.我使用的用例涉及"多对多"关系,就像您通常在标准SQL系统中看到的那样.我理解目标C不是数据库,而且工作方式不同.我还在这里查看了文档:

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/CoreData/Articles/cdRelationships.html#//apple_ref/doc/uid/TP40001857-SW10

还有其他几个地方.然而,我仍然遇到麻烦.有人可以向我解释如果你有一个需要使用SQL交叉引用表的用例你会怎么做?例如:

经理人| 雇员

经理可能有几名员工,但员工可能还有几位经理.在SQL中,我创建了一个交叉引用表,然后使用它.

示例:http://www.tomjewett.com/dbdesign/dbdesign.php?page = manymany.php

有人可以解释你如何在核心数据中做到这一点?

根据核心数据文档,他们说:

"您使用两对多关系定义多对多关系.第一对多关系从第一个实体到第二个实体.第二个到多个关系从第二个实体到第一个实体.然后将每个设置为另一个的倒数.(如果您有数据库管理的背景,这引起您的关注,请不要担心:如果您使用SQLite存储,Core Data会自动为您创建中间连接表.) "

但是,除了"不担心"之外,我不知道这怎么可能起作用?

mor*_*tar 55

彼得:"我有九个老板,鲍勃." 鲍勃:"再说一次?" 彼得:" ."

把你的大脑从数据库中拿出来.不要问如何访问交叉引用表.询问如何为经理或员工的经理找到员工.

如果使用NSManagedObject的自定义子类,则可以按文档声明属性.然后你可以简单地说:

NSSet *mgrsEmployees = mgr.employees;
NSSet *employeesMgrs = employee.managers;
Run Code Online (Sandbox Code Playgroud)

这不会给你所有员工和所有经理,只有那位经理的所有员工和该员工的所有经理.改变关系:

[mgr addEmployeesObject:newEmployee];
[newEmployee addManagersObject:mgr]; // not necessary, automatic if you define inverse

[mgr removeEmployeesObject:transferredEmployee];
[transferredEmployee removeManagersObject:mgr]; // not necessary
[newMgr addEmployeesObject:transferredEmployee];
[transferredEmployee addManagersObject:newMgr]; // not necessary
Run Code Online (Sandbox Code Playgroud)

您只需要执行每对语句中的任何一个,并且只要您将经理和员工定义为彼此的反转,它就会隐式地执行另一个.

如果您不使用自定义子类,则访问更加冗长

NSSet *mgrsEmployees = [mgr valueForKey:@"employees"];
NSSet *employeesMgrs = [employee valueForKey:@"managers"];

NSMutableSet *changeMgrsEmployees = [mgr mutableSetValueForKey:@"employees"];
[changeMgrsEmployees addObject:newEmployee];
// not necessary
NSMutableSet *changeEmployeesMgrs = [employee mutableSetValueForKey:@"managers"];
[changeEmployeesMgrs addObject:mgr];
Run Code Online (Sandbox Code Playgroud)

等等.

  • 这是我在堆栈溢出时见过的最好的答案之一.非常感谢!我的眼里几乎有泪水,我对此非常困惑. (6认同)
  • 八个老板......八个,鲍勃. (4认同)