假设我有 2 个模型:公司和员工。一个公司有很多员工,一个员工属于一个公司。
在 Rails 中,我会做一些简单的事情:
class Company < ActiveRecord::Base
has_many :employees
end
class Employee < ActiveRecord::Base
belongs_to :company
end
我可以做如下查询:
Employee.where(company_id: 1)
现在,让我们看看如何在 Core Data 中执行此操作。我创建了两个实体:公司和员工。我为每个生成了 NSManagedObject 子类,现在我想做一个简单的可重用查询,返回特定公司的员工。
我是这样做的:首先,我创建了一个名为 Employee+queries 的类别。在 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
- 为公司创建请求
- 做查询
- 获取结果的第一个元素(只有一个,因为每个公司都有一个唯一的 id)
- company.employees 是一个 NSSet,所以我将它转换为一个可在 TableViewController 中使用的 NSArray
现在,在我需要它的控制器中,我可以执行以下操作:
NSArray *employees = [Employee whereCompanyIDis: 1]
对于我正在尝试做的事情来说,这似乎过于复杂,因为它只是为给定公司 ID 的公司获取一系列员工。
您将如何重构/重组该代码?我在这里完全缺少的任何最佳实践?
非常感谢,尼古拉斯