【问题标题】:Selecting columns from different entities从不同实体中选择列
【发布时间】:2015-02-21 12:03:22
【问题描述】:

我不知道我是否应该画出相似之处,但不幸的是,这是我表达我的问题的唯一方式。 在 SQL 中,假设我们有两个表:

  1. 包含员工 ID、员工姓名、部门 ID 列的员工
  2. Dept. ID、Dept Name 列的部门

部门 ID。 Employee表中的外键是Department表中的外键。

现在假设我要获取以下列: 员工 ID、员工姓名、部门名称

使用 SQL,例如:

SELECT A.EMPLOYEE_ID, A.EMPLOYEE_NAME, B.DEPT_NAME
FROM EMPLOYEE A, DEPARTMENT B
WHERE A.DEPT_ID = B.DEPT_ID

如何在 Swift 中使用 Core Data 来做到这一点?我想我只看到参考资料让我感到困惑 NSFetchRequest(entityName: entityName) 其中 entityName 指的是单个实体(关系数据库术语中的表)

我非常感谢任何可以帮助我消除疑虑的指针或示例。

谢谢

【问题讨论】:

  • 我想我从 Apple 文档中找到了一个提示...使用预取 (relationshipKeyPathsForPrefetching)...事实上,他们引用了相同的员工部门示例,尽管在 O/C 中

标签: swift core-data


【解决方案1】:

当然可以创建一个等同于您的 SQL 查询的提取请求。更复杂的查询可能很难通过单个获取请求来实现,如果不是不可能的话。但我建议尽量不要在 CoreData 和 SQL 之间进行比较,至少在您掌握它的工作原理之前是这样。

举个例子,在 CoreData 的世界视图中,Employee 将是一个与另一个实体 Department 有关系的实体。基于Employee 实体的获取请求将返回Employee 对象数组,并且(假设您为每个实体创建 NSManagedObject 的子类)您可以使用简单的点符号访问属性:

let employeeName = myEmployeeObject.employeeName

但是您可以使用相同的符号同样轻松地遍历关系:

let departmentName = myEmployeeObject.department.departmentName

您无需担心连接等; CoreData 为您处理。

现在,假设您尝试以“SQL 方式”进行操作。您可以基于 Employee 实体构造一个获取请求,但指定同样遍历关系的“要获取的属性”:

let fetch = NSFetchRequest(entity:"Employee")
fetch.propertiesToFetch = ["employeeID", "employeeName", "department.departmentName"]

为此,您需要将获取请求的“resultType”指定为 DictionaryResultType:

fetch.resultType = .DictionaryResultType

此查询的结果将是一个包含相关键和值的字典数组。但是与底层对象的链接丢失了。如果您随后想要从相关的Department(甚至是Employee)访问任何详细信息,则必须运行新的 fetch 以获取对象本身。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多