3

我很難搞清楚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]); 

回答

4

應如何n創建賬戶和部門對象,以便建立一對多關係?

如果您已在模型中配置核心數據,核心數據將自動填充您的反比關係。因此,根據您構建代碼的方式,您可以放置​​newAccount.department = aDepartment;,並且您的關係和反向都將創建。

我應該怎麼做CoreDataGeneratedAccessors?創建後,應該我叫CachedDepartment的-addAddressesObject功能或我將需要做出類似anAccount.department = aDepartment,這就是它?

是的,就是這樣。參見前面的子答案。生成的訪問器可以防止程序的流程更加明智地以其他方式工作,或者如果尚未定義反向關係。

你可以做的

[aDepartment addAddressesObject:anAccount]; 

代替

anAccount.department = aDepartment; 

但你並不需要做兩件事。

在創建對象的每種情況下,我如何確保向部門添加地址不會創建地址的雙重實例並存儲它?

如果沒有調用兩種方法,這沒有任何作用,因爲關係被存儲爲NSMutableSet,你不能在同一對象添加到一組不止一次。

+0

非常感謝!還有一件事我想知道的是如何使用managedObjectContext(在我的問題中檢查編輯)。如你所見,我使用[cachedDepartment managedObjectContext]。 – 32l3n 2012-01-04 09:09:46

+0

它將是一樣的 - 你的應用中只有一個託管對象的上下文(你可以有更多的,但我懷疑你在這個階段做的!),所以使用部門對象中的一個很好,或者來自自己的如果你在同一個對象內,也是很好的。 – jrturton 2012-01-04 09:13:39