Swift 从不同实体中选择列

Swift 从不同实体中选择列,swift,core-data,Swift,Core Data,我不知道我是否应该进行比较,但不幸的是,这是我表达我的问题的唯一方式。 在SQL中,假设我们有两个表: 列为“员工ID”、“员工姓名”、“部门ID”的员工 带有部门ID、部门名称列的部门开始 员工表中的部门ID与部门表中的部门ID是外键 现在假设我要获取以下列: 员工ID、员工姓名、部门名称 使用SQL语句,例如: SELECT A.EMPLOYEE_ID, A.EMPLOYEE_NAME, B.DEPT_NAME FROM EMPLOYEE A, DEPARTMENT B WHERE A.DE

我不知道我是否应该进行比较,但不幸的是,这是我表达我的问题的唯一方式。 在SQL中,假设我们有两个表:

  • 列为“员工ID”、“员工姓名”、“部门ID”的员工
  • 带有部门ID、部门名称列的部门开始
  • 员工表中的部门ID与部门表中的部门ID是外键

    现在假设我要获取以下列: 员工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中的核心数据实现这一点?我想我只是因为看到了对它的引用而感到困惑
    NSFetchRequest(entityName:entityName)
    其中entityName引用单个实体(关系数据库术语中的表)

    我真的很感激任何能帮助我澄清疑问的建议或例子


    谢谢

    当然可以创建一个与SQL查询等价的获取请求。更复杂的查询即使不是不可能通过单个获取请求实现,也是很困难的。但我建议不要在CoreData和SQL之间进行类比,至少在您了解它的工作原理之前是这样

    举个例子,在世界的CoreData视图中,
    员工
    将是一个与另一个实体有关系的实体,
    部门
    。基于
    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
    

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

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