0

假设我有 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 的公司获取一系列员工。

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

非常感谢,尼古拉斯

4

1 回答 1

1

原则上,如果您只有一个“公司 ID”而不是托管对象,那么这是正确的方法。但是您可以通过直接获取员工来简化请求:

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

如果您想在表格视图中显示员工,您还应该考虑使用NSFetchedResultsController(使用上述获取请求)。如果插入、删除或修改对象,获取的结果控制器可以自动更新表视图。

于 2013-09-13T05:09:45.440 回答