Swift 从不同实体中选择列
我不知道我是否应该进行比较,但不幸的是,这是我表达我的问题的唯一方式。 在SQL中,假设我们有两个表: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
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