我正在创建一个应用程序并尝试使用核心数据,因为它似乎是 Objective-C 批准的创建数据存储系统的方法。我的用例涉及“多对多”关系,就像您通常在标准 SQL 系统中看到的那样。我知道 Objective-C 不是数据库并且工作方式不同。我还查看了此处的文档:
还有其他几个地方。然而,我仍然遇到麻烦。如果您有一个需要使用 SQL 交叉引用表的用例,有人可以向我解释您会怎么做吗?例如:
经理 |员工
经理可能有几个员工,但员工也可能有几个经理。在 SQL 中,我会创建一个交叉引用表,然后使用它。
示例:http://www.tomjewett.com/dbdesign/dbdesign.php?page=manymany.php
有人可以解释一下您如何在 Core data 中做到这一点吗?
根据核心数据文档,他们是这样说的:
“您使用两个对多关系定义多对多关系。第一个对多关系从第一个实体到第二个实体。第二个对多关系从第二个实体到第一个实体实体。然后将每个实体设置为另一个实体的倒数。(如果你有数据库管理背景并且这让你担心,别担心:如果你使用 SQLite 存储,Core Data 会自动创建中间连接表你。)”
但是,除了“不担心”之外,我不知道这怎么可能?
最佳答案
彼得:“鲍勃,我有九个个老板。” 鲍勃:“再说一遍?” 彼得:“九个。”
将您的大脑从数据库中解放出来。不要问如何访问交叉引用表。询问如何为经理查找员工或为员工查找经理。
如果您使用 NSManagedObject 的自定义子类,您可以按照文档声明属性。然后你可以简单地说:
NSSet *mgrsEmployees = mgr.employees;
NSSet *employeesMgrs = employee.managers;
这不会为您提供所有员工和所有经理,只会为您提供该经理的所有员工和该员工的所有经理。改变关系:
[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
您只需执行每对语句中的一个,它会隐式地执行另一个,前提是您已将经理和员工定义为彼此的逆向。
如果不使用自定义子类,访问会稍微冗长一些
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];
等等
关于iphone - 你如何管理和使用 "Many to many"核心数据关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7572657/