Предположим, у меня есть 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]
кажется слишком сложным для того, что я пытаюсь сделать что просто получить массив сотрудников для компании дали идентификатор компании ,
Как бы вы реорганизовали/реорганизовали этот код? Какие-нибудь лучшие практики, которые я здесь полностью отсутствует?
Спасибо большого, Николя
Спасибо за ответ. Это все еще кажется безумно сложным для чего-то такого простого. Чтобы завершить свой ответ, распространено ли использование категорий для определения запросов к моделям? или это более распространенные практики, чтобы сделать что-то другое? Имеет ли смысл доступ к NSManagedObjectContext, как я это сделал?Все эти движущиеся фигуры для чего-то простые, как запрос, меня немного смущает :) –
@NicolasM: Это вопрос вкуса, если вы определяете запрос в категории или где-то еще. Методы доступа к «глобальному» контексту также сильно различаются, вы можете получить его из AppDelegate или передать его с одного контроллера на другой. Если вы работаете с «вложенными контекстами», последний метод лучше. - Но вы можете взглянуть на библиотеку https://github.com/magicalpanda/MagicalRecord, которая имеет * lots * методов и категорий утилиты для упрощения большинства задач Core Data. Ваш запрос на выбор будет выглядеть как 'NSArray * employees = [Employee MR_findByAttribute: @" company.id "withValue: @ (companyId)'. –
Спасибо большое! MagicalRecord кажется довольно интересным. –