我很难搞清楚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]);
答案 0 :(得分:4)
如何创建帐户和部门对象以便建立一对多的关系?
如果您在模型中配置了核心数据,核心数据将自动为您填充反向关系。因此,根据您构建代码的方式,您可以放置newAccount.department = aDepartment;
,并创建您的关系和反向关系。
我应该如何处理CoreDataGeneratedAccessors?创建之后,我应该调用CachedDepartment的-addAddressesObject函数,还是需要创建像
anAccount.department = aDepartment
这样的东西呢?
是的,就是这样。见前面的子答案。生成的访问器以防万一程序流程使得以其他方式工作更加明智,或者如果您没有定义反向关系。
你可以做到
[aDepartment addAddressesObject:anAccount];
而不是
anAccount.department = aDepartment;
但你不需要同时做这两件事。
在创建对象的每种情况下,如何确保向部门添加地址不会创建地址的双重实例并存储它?
如果 调用了两种方法,这将无效,因为关系存储为NSMutableSet
,并且您不能将同一个对象多次添加到集合中。