0
之間的關係時

任何人都可以解釋爲什麼給出以下MagicalRecord導入代碼EXC-BAD權限設置兩個對象

__block NSManagedObject *importedObject = nil; 

[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) { 
    id entityClass = NSClassFromString(name); 
    importedObject = [entityClass importFromObject:dictionary inContext:localContext]; 
}]; 

NSManagedObjectID *importedObjectID = importedObject.objectID; 

NSManagedObject *relatedObject = ((CustomRelatedExampleObject *) [[NSManagedObjectContext defaultContext] objectWithID:importedObjectID]).relatedObject; 

也能正常工作,設置的關係,並保存爲預期

[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) { 
     someObjectInDefaultContext.alsoRelated = relatedObject; 
}]; 

但是這會導致exec訪問錯誤,因爲我希望這在技術上更加正確,因爲我使用本地上下文來保存數據。 (注:我離開了那得到的ObjectID從兩個對象爲簡潔的代碼)

[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) { 
     AnotherCustomExampleObject *localSomeOtherObjectInDefaultContext = (AnotherCustomExampleObject *) [localContext objectWithID:someOtherObjectInDefaultContextObjectID]; 
     CustomRelatedExampleObject *localRelatedObject = (CustomRelatedExampleObject *) [localContext objectWithID:localRelatedObjectID]; 
     localSomeOtherObjectInDefaultContext.alsoRelated = localRelatedObject; 
}]; 

我上最後一行的exec壞訪問時,我嘗試將對象分配給其他對象的關係。

更新1

這個問題已經在另一個管理對象上下文獲取對象的本地副本時,使用臨時對象ID引起的。

UPDATE 2

我們已經發現,簡單地改變用於檢索對象的方法去除錯誤。

[MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) { 
    AnotherCustomExampleObject *localSomeOtherObjectInDefaultContext = (AnotherCustomExampleObject *) [localContext existingObjectWithID:someOtherObjectInDefaultContextObjectID]; 
    CustomRelatedExampleObject *localRelatedObject = (CustomRelatedExampleObject *) [localContext existingObjectWithID:localRelatedObjectID]; 
    localSomeOtherObjectInDefaultContext.alsoRelated = localRelatedObject; 
}]; 

使用existingObjectWithID而不是objectWithID返回和具有永久ID而不是臨時ID的對象。

回答

1

檢查您的對象ID。如果其中一個或兩個都是臨時的,核心數據將不會那樣。但是,一般來說,你所描述的崩潰是因爲你試圖從不同的上下文中關聯兩個對象。我知道你正在通過適當的步驟在這裏,但也許再次檢查調試器,以確保這些對象的上下文是相同的。

+0

感謝casademora,即使保存了導入對象的上下文,但對象確實仍具有臨時ID。這是因爲魔法記錄使用父上下文來實際上將數據保存到商店。由於我已經從對象中取出對象ID,所以在保存父上下文時不會更新它。 – nacross 2013-05-01 01:32:04

+0

我發現瞭解決問題的方法後更新了問題,您是否能夠闡明爲什麼這會起作用? – nacross 2013-05-01 02:33:19

+0

existingObjectWithID的工作原理是它僅從當前上下文返回一個對象。我最近遇到了這個問題,並且更新了MR_inContext:通過所有的方法來查找基於objectID的對象。看看實驗分支。 – casademora 2013-05-01 05:24:44