如何在核心数据中管理一对多关系



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

假设我们有以下模式,其中有持有大量帐户(我们的地址)的部门。

我已经使用编辑器创建了我的核心数据文件。在CachedDepartment类中,我添加了必要的属性,并创建了一个多对多关系,并选择了CachedAccount的"Department"属性的"Inverse"。CacheAccount也有属性,以及一个与CachedDepart的"addresses"关系相反的关系。

我有以下来源(我给你两个头文件。其余不包含任何感兴趣的内容):

@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

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

--我应该如何处理CoreDataGeneratedAccess?创建后,我应该调用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]);

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

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

我应该如何处理CoreDataGeneratedAccess?创建后,我应该调用CachedDepartment的-addAddressesObject函数吗?否则我需要制作类似anAccount.department = aDepartment的东西,仅此而已?

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

你可以做

[aDepartment addAddressesObject:anAccount];

而不是

anAccount.department = aDepartment;

但你不需要两者都做。

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

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

最新更新