2009-10-20 60 views
6

我有一個名爲importMoc的內存管理對象上下文,我用它來導入記錄(例如僱員)。我已經解析了一個文件,並在importMoc中設置了一個非常重要的異常。用戶確認他們想要處理%d員工,但我無法弄清楚如何或何時設置員工的「父母」關係(例如設置其部門)。在導入核心數據時建立關係?

爲了我的目的,他們都將被導入到同一個部門(用戶已經隱式選擇)。

很明顯,我不能設置在兩個上下文中的關係,這樣做我:

  1. 創建importMoc一個部門,然後當我合併更改合併與「真正的」部門「進口」處?
  2. 2)合併員工,然後獲取所有剛進口的員工(不知何故!!!),然後設置他們的部門?
  3. 3)我忽略了一些其他解決方案?

這似乎是一個簡單的問題,但由於某種原因(懶惰?疲倦?愚蠢?)我無法弄清楚如何去做!到目前爲止我嘗試過的所有東西似乎太複雜了!

在此先感謝!

回答

0

1 /假定僱員記錄X具有名稱Y和部門ID 15(即,它經由一個關係是指id爲15處)從被管理對象的上下文與部門ID 15

2 /負載部

3 /創建引用在(2)

即創建對象僱員(注:樣品代碼只,可能不會編譯):

NSEntityDescription * departmentED = [NSEntityDescription entityForName:@"Department" inManagedObjectContext:moc]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(id == %@)", deptId]; 

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
[request setEntity:departmentED]; 
[request setPredicate:predicate]; 

NSError *error = nil; 
NSArray *array = [moc executeFetchRequest:request error:&error]; 

/* create employee */ 

NSEntityDescription * employeeED = [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:moc]; 
NSManagedObject * employeeMO = [[[NSManagedObject alloc] initWithEntity:employeeED insertIntoManagedObjectContext:moc] autorelease]; 

/* set employee department to department instance loaded above */ 
[receiptObject setValue:[array objectAtIndex:0] forKey:@"department"]; 
+0

感謝diciu,但這並沒有回答我關於在兩個不同的上下文之間建立關係的最佳方式的問題(如Core中推薦的數據編程指南 - 高效導入數據)。 由於時間限制,我目前停止使用第二個託管對象上下文進行導入,但我仍然很想知道正確的方法。 我還發現了以下最近的問題,但提供的答案不是很令人滿意: http:// stackoverflow。com/questions/1554623/illegal-attempt-to-establish-a-relationship-xyz-between-objects-in-different-co – Matthew 2009-10-21 03:09:41

4

如果Department對象已被保存到持久性存儲中,則可以將它們帶入另一個託管對象上下文。因爲無論如何你的對象都必須住在同一個持久存儲中(因爲不允許跨商店關係),你應該能夠簡單地將你需要的對象取回到importMoc中。

例如:

foreach (NSDictionary *record in employeeRecords) { 
    NSManagedObject *employee = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:importMoc]; 
    // Configure employee however you do that 

    NSString *managerID = [record objectForKey:@"someKeyThatUniquelyIdentifiesTheManager"]; 
    NSFetchRequest *managerFetchRequest = [[NSFetchRequest alloc] init]; 
    [managerFetchRequest setEntity:[NSEntity entityForName:@"Manager" inManagedObjectContext:importMoc]]; 
    [managerFetchRequest setPredicate:[NSPredicate predicateWithFormat:@"managerProperty == %@", managerID]]; 
    NSArray *managers = [importMoc executeFetchRequest:managerFetchRequest error:nil]; // Don't be stupid like me and catch the error ;-) 
    [managerFetchRequest release]; 

    if ([managers count] != 1) { 
     // You probably have problems if this happens 
    } 

    [employee setValue:[managers objectAtIndex:0] forKey:@"manager"]; 
} 

你也可以只是做一個單一的讀取請求得到所有的管理人員到importMoc,然後篩選陣列來定位每一次正確的。這可能會更有效率。換句話說,不要做我剛剛告訴你做的事情:-)

+0

因此,閱讀精細的手冊: 如果我放棄你說的忽略的謂詞並調用[importMoc executeFetchRequest:error:]我將得到一個數組,其中包含已保存到持久性存儲區的所有管理器(無論其上下文如何),無論它們是否已保存,都會加上當前(importMoc)上下文中的任何管理器,不。 我的理解是否正確? – Matthew 2009-10-22 01:00:03

+0

正確。上下文只在對象在內存中時很重要。一旦它們被保存到持久性存儲中,就可以將它們提取到任何上下文中。 – Alex 2009-10-22 04:55:07

+0

只是一個快速的說明,非常感謝這個答覆亞歷克斯。如果具有相同的持久性存儲協調器,我還沒有意識到提取會將對象添加到單獨的上下文中。我有這個相同的問題,這個答案對我來說是一種享受! – 2010-05-07 13:16:03