我很難搞清楚Core Data如何處理其數據庫的一些事情。我將用一個具體的例子來解釋我的問題:如何管理核心數據中的一對多關係?
讓我們說,我們有以下架構,其中有部門擁有衆多帳戶(我們的地址)。
我已經使用編輯器創建了我的Core Data文件。在CachedDepartment類中,我添加了必要的屬性,並且創建了一個多對多的關係,並且我選擇了「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]);
非常感謝!還有一件事我想知道的是如何使用managedObjectContext(在我的問題中檢查編輯)。如你所見,我使用[cachedDepartment managedObjectContext]。 – 32l3n 2012-01-04 09:09:46
它將是一樣的 - 你的應用中只有一個託管對象的上下文(你可以有更多的,但我懷疑你在這個階段做的!),所以使用部門對象中的一個很好,或者來自自己的如果你在同一個對象內,也是很好的。 – jrturton 2012-01-04 09:13:39