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的對象。
感謝casademora,即使保存了導入對象的上下文,但對象確實仍具有臨時ID。這是因爲魔法記錄使用父上下文來實際上將數據保存到商店。由於我已經從對象中取出對象ID,所以在保存父上下文時不會更新它。 – nacross 2013-05-01 01:32:04
我發現瞭解決問題的方法後更新了問題,您是否能夠闡明爲什麼這會起作用? – nacross 2013-05-01 02:33:19
existingObjectWithID的工作原理是它僅從當前上下文返回一個對象。我最近遇到了這個問題,並且更新了MR_inContext:通過所有的方法來查找基於objectID的對象。看看實驗分支。 – casademora 2013-05-01 05:24:44