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