组织和简化核心数据查询

时间:2013-09-12 22:56:27

标签: ios objective-c ruby-on-rails core-data

假设我有两种模式:公司和员工。公司有很多员工,员工属于公司。

在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的公司获得一系列员工。

您将如何重构/重新组织该代码?我在这里完全没有的任何最佳实践?

非常感谢, 尼古拉斯

1 个答案:

答案 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(带有上述获取请求)。取得的结果 如果插入,删除对象,控制器可以自动更新表视图 或修改。