假设我有两种模式:公司和员工。公司有很多员工,员工属于公司。
在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
我执行以下操作:
现在,在我需要它的控制器中,我可以这样做:
NSArray *employees = [Employee whereCompanyIDis: 1]
对于我正在尝试做的事情来说,这似乎过于复杂,只是为了给公司ID的公司获得一系列员工。
您将如何重构/重新组织该代码?我在这里完全没有的任何最佳实践?
非常感谢, 尼古拉斯
答案 0 :(得分:1)
原则上这是正确的方法,如果你只有一个“公司ID”, 而不是托管对象。但您可以通过直接提取员工来简化请求:
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Employee"];
request.predicate =[NSPredicate predicateWithFormat:@"company.id = %d", companyID];
NSError *error;
NSArray *employees = [context executeFetchRequest:request error:&error];
如果要在表格视图中显示员工,还应考虑使用
a NSFetchedResultsController
(带有上述获取请求)。取得的结果
如果插入,删除对象,控制器可以自动更新表视图
或修改。