如何管理Core Data中的一对多关系?

时间:2012-01-04 08:10:02

标签: objective-c core-data nsmanagedobjectcontext nsfetchrequest iphonecoredatarecipes

我很难搞清楚Core Data如何处理数据库的一些事情。我将用一个具体的例子解释我的问题:

我们只是说我们有以下架构,其中有些部门拥有多个帐户(我们的地址)。

我使用编辑器创建了我的Core Data文件。在CachedDepartment类中,我添加了必要的属性,并且我创建了一个to-many关系,并且我选择了“Inverse”到我的CachedAccount的Department属性.CacheAccount也有属性,并且关系与“解决“CachedDepartment的关系。

我有以下来源(我给你2个头文件。其余的没有任何兴趣):

@interface CachedAccount : NSManagedObject {
@private
}
@property (nonatomic, retain) NSNumber * accountID;
@property (nonatomic, retain) NSString * email;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) CachedDepartment *department;
@end

@class CachedAccount;

@interface CachedDepartment : NSManagedObject {
@private
}
@property (nonatomic, retain) NSString * departmentID;
@property (nonatomic, retain) NSString * departmentName;
@property (nonatomic, retain) NSSet *addresses;
@end

@interface CachedDepartment (CoreDataGeneratedAccessors)

- (void)addAddressesObject:(CachedAccount *)value;
- (void)removeAddressesObject:(CachedAccount *)value;
- (void)addAddresses:(NSSet *)values;
- (void)removeAddresses:(NSSet *)values;

@end

现在的问题是:
- 如何创建帐户和部门对象,以便建立一对多的关系?

- 我应该如何处理CoreDataGeneratedAccessors?创建之后,我应该调用CachedDepartment的-addAddressesObject函数,还是需要创建类似anAccount.department = aDepartment的东西,那就是它?

- 在每种情况下,在创建对象时,如何确保向部门添加地址不会创建地址的双重实例并存储它?

我很感激对此有任何见解。

编辑:

为CachedDepartment实体插入新对象应如下所示:

NSManagedObject *cachedDepartment= [NSEntityDescription
    insertNewObjectForEntityForName:@"CachedDepartment" 
    inManagedObjectContext:[self managedObjectContext]];
/*
set values for failedBankInfo here
*/
NSError *error;
if (![context save:&error]) {
    NSLog(@"The following error occured: %@", [error localizedDescription]);
}

然后将为cachedAccounts添加一条新记录,该记录将与新插入的cachedDepartment对象保持一对多关系,如下所示:

NSManagedObject *cachedAccounts = [NSEntityDescription
    insertNewObjectForEntityForName:@"CachedAccounts" 
    inManagedObjectContext:[<b>cachedDepartment managedObjectContext</b>]];
    /*
    set values for failedBankInfo here
    */
//setting the one-to-many relationship
[cachedDepartment addCachedAccountObject:cachedAccount];
[cachedAccount setCachedDepartment:cachedDepartment];
//
NSError *error;
if (![context save:&error]) {
    NSLog(@" couldn't save: %@", [error localizedDescription]);

1 个答案:

答案 0 :(得分:4)

  

如何创建帐户和部门对象以便建立一对多的关系?

如果您在模型中配置了核心数据,核心数据将自动为您填充反向关系。因此,根据您构建代码的方式,您可以放置​​newAccount.department = aDepartment;,并创建您的关系和反向关系。

  

我应该如何处理CoreDataGeneratedAccessors?创建之后,我应该调用CachedDepartment的-addAddressesObject函数,还是需要创建像anAccount.department = aDepartment这样的东西呢?

是的,就是这样。见前面的子答案。生成的访问器以防万一程序流程使得以其他方式工作更加明智,或者如果您没有定义反向关系。

你可以做到

[aDepartment addAddressesObject:anAccount];

而不是

anAccount.department = aDepartment;

但你不需要同时做这两件事。

  

在创建对象的每种情况下,如何确保向部门添加地址不会创建地址的双重实例并存储它?

如果 调用了两种方法,这将无效,因为关系存储为NSMutableSet,并且您不能将同一个对象多次添加到集合中。