2015-02-21 2 views
0

Я не знаю, должен ли я рисовать параллели, но, к сожалению, это единственный способ выразить свою проблему. В SQL, предположим, что у нас есть две таблицы:Выбор столбцов из разных объектов

  1. Сотрудник с колоннами Сотрудник ID, Имя сотрудника, Департамент ID
  2. Deptartment с колоннами Отдел ID, Отдел Имя

каф ID. в таблице Employee - внешний ключ с таблицей Департамента.

Теперь предположим, что я хочу, чтобы принести следующие столбцы: Employee 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 относится к одному лицу (таблица в реляционной БД жаргоне)

Я бы очень признателен за любые указатели или примеры, которые могут помочь мне очистить мои сомнения ,

Благодаря

+0

Я предполагаю, что нашел подсказку из документации Apple ... Используя предварительную выборку (отношениеKeyPathsForPrefetching) ... infact, они ссылаются на один и тот же пример сотрудников, хотя в O/C – GCA

ответ

0

Это, конечно, можно создать выборку запроса, что эквивалентно вашего запроса. Более сложные запросы могут быть трудными, если не невозможными, с помощью одного запроса на выборку. Но я рекомендую попробовать НЕ проводить параллели между 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), вам нужно будет запустить новую выборку, чтобы получить сам объект.

Смежные вопросы