gpt4 book ai didi

ios - 组织和简化核心数据查询

转载 作者:行者123 更新时间:2023-11-29 03:38:46 26 4
gpt4 key购买 nike

假设我有 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

现在,在我需要的 Controller 中,我可以执行以下操作:

NSArray *employees = [Employee whereCompanyIDis: 1]

对于我想要做的事情来说,这似乎过于复杂,我只是为给定公司 ID 的公司获取一组员工。

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

非常感谢,尼古拉斯

最佳答案

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

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

如果您想在表格 View 中显示员工,您还应该考虑使用NSFetchedResultsController (带有上面的获取请求)。获取到的结果如果插入、删除对象, Controller 可以自动更新 TableView 或修改。

关于ios - 组织和简化核心数据查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18775621/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com