0

任何人都可以解释为什么给出以下 MagicalRecord 导入代码

__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 bad access。

更新 1

此问题是由在另一个托管对象上下文中获取对象的本地副本时使用临时对象 ID 引起的。

更新 2

我发现只需更改用于检索对象的方法即可消除错误。

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

使用 existingObjectWithID 而不是 objectWithID 返回和对象具有永久 id 而不是临时的。

4

1 回答 1

1

检查您的对象 ID。如果一个或两个都是临时的,核心数据就不会这样。但是,一般来说,您描述的崩溃是因为您试图将来自不同上下文的两个对象关联起来。我知道您在这里执行了正确的步骤,但可能会在调试器中仔细检查以确保这些对象上的上下文是相同的。

于 2013-04-29T13:54:10.730 回答