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