核心数据和多对多

Posted

技术标签:

【中文标题】核心数据和多对多【英文标题】:Core Data & Many-to-Many 【发布时间】:2017-11-28 16:55:55 【问题描述】:

我的 ios 应用程序与两个核心数据实体配合得非常好:员工和部门。 我有一个 UITableViewController,它是一个 NSFetchedResultsControllerDelegate,它显示员工和有关他们的数据,另一个显示部门和有关他们的数据。

不过,我很难理解我是如何添加关系的。 我了解如何创建关系(使用数据模型的图形视图),但我似乎找不到任何关于添加实际关系的好信息。

在标准 SQL 数据库中,我将有一个包含 DepartmentID 和 EmployeeID 列的交叉引用表来链接它们。但这似乎不适用于 Core Data。

如何在 Swift 中添加实体关系?

【问题讨论】:

为了澄清,如果你有一个“HR”部门和一个员工“Bob”,你问如何将“Bob”添加到“HR”部门(与“HR”相反也添加“鲍勃”)? @ghostatron 是的,完全正确。 (当然还有如何找到 HR 中的所有员工以及 Bob 关联的所有部门。) 我讨厌它,但我发现的唯一方法是:employeeBob.mutableSetValue(forKey: "departments").add(hrDepartment)。那应该为您处理更新逆。然后,稍后,您可以调用 employeeBob.departments 来获取具有 hrDepartment 的集合。 @ghostatron 在该示例中,我假设 forKey 值是我的数据模型中的关系名称。但是 add() 中的 hrDepartment 是什么?我会使用 DepartmentID 或 DepartmentTitle 还是什么?它是怎么知道的? 正确,关键是关系的名称。 hrDepartment 是一个实际的 Department NSManagedObject 实例。 【参考方案1】:

您可以通过执行类似于此 sn-p 的操作来使用 mutableSetValue:

let employeeBob: Employee = ...
let departmentHR: Department = ...
employeeBob.mutableSetValue(forKey: "departments").add(departmentHR)

之后,您可以通过请求employeeBob.departments 访问Bob 的部门,或者您可以通过请求departmentHR.employees 来获取HR 中的员工。 (即 sn-p 也会为您处理逆向操作。)

如果你想检查 Bob 是否已经在 HR,那么你可以检查是否 departmentHR.employees.contains(employeeBob)。但是,要小心,因为它通过引用(不是员工 ID 或其他)进行检查......也就是说,如果您创建 Bob 两次(2 个不同的 NSManagedObjects 具有不同的 NSManagedObjectId),那么它们将不会“匹配”。也就是说,因为它是一个集合,如果你知道 Bob 是 Bob(比如,每次你看到 Bob,它都是同一个 Bob 对象/引用),那么你可以一遍又一遍地添加他,这个集合会自动保护你免受欺骗.

【讨论】:

以上是关于核心数据和多对多的主要内容,如果未能解决你的问题,请参考以下文章

Json序列化,有多对一和多对多关系时出现的问题

Hibernate映射( 多对一对一对多多对多)的配置方法

Mybatis入门---一对多多对多

MySQL 表的一对一对多多对多问题

MySQL数据库07 /MySQL 表的一对一对多多对多问题

简述数据库设计中一对多和多对多的应用场景?