从不同实体中选择列

时间:2015-02-21 12:03:22

标签: swift core-data

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

  1. 包含员工ID,员工姓名,部门ID
  2. 列的员工
  3. Deptartment with columns Dept. ID,Dept Name
  4. 部门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引用单个实体(关系数据库术语中的表)

    我真的很感激任何可以帮助我理清疑虑的指针或例子。

    谢谢

1 个答案:

答案 0 :(得分:0)

当然可以创建一个与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)中的任何详细信息,则必须运行新的获取以获取对象本身。