2013-09-12 3 views
0

Предположим, у меня есть 2 модели: компания и сотрудник. В компании много сотрудников, а сотрудник принадлежит компании.Организация и упрощение основного запроса данных

В рельсах, я бы что-то простое:

class Company < ActiveRecord::Base 
    has_many :employees 
end 
class Employee < ActiveRecord::Base 
    belongs_to :company 
end 

, и я мог бы сделать запросы, как:

Employee.where(company_id: 1) 

Теперь давайте рассмотрим делать это в Core Data. Я создал два объекта: «Компания и сотрудник». Я создал NSManagedObject suclasses для каждого, и теперь я хочу сделать простой многоразовый запрос, который возвращает сотрудника для конкретной компании.

Вот как я это сделал: Во-первых, я создал категорию под названием Employee + query. В Employee + queries.h, у меня есть:

@interface Employee (queries) 
    + (NSArray *)whereCompanyIDis:(int)companyID; 
@end 

В Employee + queries.m, у меня есть:

@implementation Employee (queries) 
    + (NSArray *)whereCompanyIDis:(int)companyID { 
    NSManagedObjectContext *context = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Company"]; 
    request.predicate =[NSPredicate predicateWithFormat:@"id = %d", companyID]; 
    NSError *error; 
    NSArray *companies = [context executeFetchRequest:request error:&error]; 
    Company *company = [companies objectAtIndex:0]; 
    return [company.employees allObjects]; 
    } 
@end 

я делаю следующее:

  • получить NSManagedObjectcontext
  • создать запрос
  • сделать запрос
  • получить первый элемент результатов (там будет только один, как есть уникальный идентификатор в компании)
  • company.employees является NSSet поэтому я преобразовать его в NSArray, который может использоваться в TableViewController

Теперь в моих контроллерах, где мне нужно, я могу сделать:

NSArray *employees = [Employee whereCompanyIDis: 1] 

кажется слишком сложным для того, что я пытаюсь сделать что просто получить массив сотрудников для компании дали идентификатор компании ,

Как бы вы реорганизовали/реорганизовали этот код? Какие-нибудь лучшие практики, которые я здесь полностью отсутствует?

Спасибо большого, Николя

ответ

1

В принципе, что это правильный путь, если у вас есть только «ИН», чтобы начать с, и не управляемым объектом. Но упростить запрос на выборку сотрудников непосредственно:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Employee"]; 
request.predicate =[NSPredicate predicateWithFormat:@"company.id = %d", companyID]; 
NSError *error; 
NSArray *employees = [context executeFetchRequest:request error:&error]; 

Если вы хотите отобразить сотрудников ввиду в таблицы, вы должны также рассмотреть возможность использования NSFetchedResultsController (с выше выборки запроса). Полученные результаты Контроллер может автоматически обновлять представление таблицы, если объекты вставлены, удалены или изменены.

+0

Спасибо за ответ. Это все еще кажется безумно сложным для чего-то такого простого. Чтобы завершить свой ответ, распространено ли использование категорий для определения запросов к моделям? или это более распространенные практики, чтобы сделать что-то другое? Имеет ли смысл доступ к NSManagedObjectContext, как я это сделал?Все эти движущиеся фигуры для чего-то простые, как запрос, меня немного смущает :) –

+0

@NicolasM: Это вопрос вкуса, если вы определяете запрос в категории или где-то еще. Методы доступа к «глобальному» контексту также сильно различаются, вы можете получить его из AppDelegate или передать его с одного контроллера на другой. Если вы работаете с «вложенными контекстами», последний метод лучше. - Но вы можете взглянуть на библиотеку https://github.com/magicalpanda/MagicalRecord, которая имеет * lots * методов и категорий утилиты для упрощения большинства задач Core Data. Ваш запрос на выбор будет выглядеть как 'NSArray * employees = [Employee MR_findByAttribute: @" company.id "withValue: @ (companyId)'. –

+0

Спасибо большое! MagicalRecord кажется довольно интересным. –

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