假设我在核心数据中有员工实体和公司实体。
因此,员工和公司彼此相关:
员工<< --->公司
现在我试图在每个类中修改manageRelationships方法,如下所示:
@interface Employee : NSManagedObject
- (void)manageRelationships;
@property (nonatomic, retain) Company *company; // for relationship
@property (nonatomic, retain) NSNumber *companyId; // acts as foreign key
@end
@implementation Employee
@dynamic company;
@dynamic companyId;
- (void)manageRelationships
{
// prepare a predicate as @"companyId == %@",self.companyId
// execute a fetch request against Company entity
// map relationship using self.company = retrievedCompanyObject
}
现在我几乎没有问题:
如上所述,在NSManagedObject的子类中触发获取请求和映射关系是否安全?
- 醇>
他们有更好的方法来实现吗? (上面的方法背后的想法是 - 我将在每个创建的托管对象上调用上面的方法 它自动管理和映射所有相关的关系)
请建议。
答案 0 :(得分:2)
我明白你要做什么。但不要忘记,Core Data为您提供了对象图,数据库只是次要的实现细节。因此,外键的整个概念是完全没必要的,因为数据库层将为您管理。
但是,唉,我假设您在创建员工时没有Company
对象,但只是给了公司ID。当然你可以覆盖NSManagedObject
子类,也许最好在id属性的 setter 中:
-(void)setCompanyId:(NSNumber*)newId {
self.companyId = newId;
if (!newId) { self.company = nil; }
else {
Company *myCompany = ... // fetch company
self.company = myCompany;
}
}
但是,您可以看到这是多余的。无需将外键保留在您的实体中。您可以随时使用
检索它NSNumber *companyId = employee.company.id;
所以也许最好简单地在你的Employee
课程中添加一个方便地添加公司的方法:
-(void)addCompanyWithId:(NSNumber*)companyID {
if (!companyID) { self.company = nil; }
else {
Company *employer = ...// fetch company
self.company = employer ? employer : nil;
}
}