iphone - 你如何管理和使用 "Many to many"核心数据关系?

标签 iphone objective-c sqlite core-data

我正在创建一个应用程序并尝试使用核心数据,因为它似乎是 Objective-C 批准的创建数据存储系统的方法。我的用例涉及“多对多”关系,就像您通常在标准 SQL 系统中看到的那样。我知道 Objective-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

有人可以解释一下您如何在 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/

相关文章:

iphone - 验证 iPhone 设备 ID?

android - iphone 类似 android 的位置标记

iphone - 容器类的内存管理

iphone - 使用依赖子项目时 Xcode 中的链接问题

iphone - 如何使用 NSMutableArray 中的列名列表在 sqlite3 中创建表

ios - 添加第二个 UINavigationController

iphone - 如何只加载网页的主体

ios - 错误 : *use of undeclared identifier 'firstObject' on a NSArray on an iOS 7 project

mysql - 从 XML stackexchange 转储中提取问答对

android - 在sqlite中创建多个表的问题