2013-01-11 23 views
1

我正在使用核心數據觀察iOS中的一個奇怪的錯誤。 基本上,我的設置如下 - 有2個NSManagedObjectContexts,tempContextmainContext。 我使用tempContext作爲創建和編輯實體的臨時「暫存器」,當我想要保存它們時,我將它移動到mainContext以保存。 請注意,mainContext不是tempContext的母公司。如下 -在上下文之間移動對象時,iOS coredata objectWithID中的錯誤

[1] newEntity.property1 = @"SomeProperty"; 
    newEntity.managedObjectContext // this is tempContext currently 
[2] saveEntityInTempContext 
[3] newEntity = (Entity *)[mainContext objectWithID:newEntity.objectID]; 
[4] [mainContext insertObject:newEntity]; 

現在,後插入[4],如果我檢查newEntity.property1,它被設置爲nil

此舉發生。 但是,如果我在[3]之後,然後在[4]之後首先檢查屬性,它將正確顯示爲「SomeProperty」。我不明白如何強迫失敗應該在這裏有所作爲。

我的目標是將實體從一個上下文移動到另一個上下文。

+0

'[mainContext objectWithID:newEntity.objectID]'從主要上下文中返回一個對象。我認爲不需要(也可能是錯誤的)在該對象上調用insertObject,它已經被插入。 –

+0

您是如何在首位創建'newEntity'的?它是否已經插入到'tempContext'中?此外,當此代碼執行時,更改已保存在'tempContext'上? –

+0

@TomHarrington是的,'''''newEntity'''已經被插入到''tempContext'''中,步驟[2]表明這個實體被保存在''tempContext'''中。 – Devang

回答

1

我不確定直接原因是什麼,但它幾乎肯定是不必要的步驟的一個奇怪的副作用,真的沒有任何意義。我有點驚訝,你沒有在最後一步得到例外。

具體而言,步驟#4是完全不必要的。一旦完成第3步,就會有一個從mainContext加載的實例。在這一點上你不需要再做任何事情。將insertObject稱爲您剛剛從相同的託管對象上下文中查找的對象是沒有意義的。

假設tempContextmainContext使用相同的持久存儲協調,這個對象進行的生命週期如下您的步驟:已創建

  1. newEntity但未保存。 tempContext知道newEntity但數據存儲不(當然mainContext不知道它)。
  2. 保存後,數據存儲的記錄爲newEntitynewEntity的對象ID更改爲永久值。
  3. 由於您的objectWithID:調用,newEntity的實例被替換爲通過mainContext查找的不同實例。它的屬性與步驟1中創建的屬性相匹配,並在步驟2中保存到數據存儲中,因爲它們是從數據存儲加載的。
  4. 調用insertObject沒有任何用途 - 因爲您在步驟3中獲得的新newEntity已從mainContext中查找,這意味着mainContext已經知道它。這是我預期會發生異常的地方。沒有發生異常,但是這個調用仍然沒有意義。

所以,我只是放棄第4步並完成它。

+0

謝謝,這條線幫我解決了這個問題! 「調用,newEntity的實例被替換爲一個不同的實例,該實例通過」 – Devang

相關問題