gpt4 book ai didi

ios - 将 NSManagedObject 的关系更改为不同的上下文

转载 作者:行者123 更新时间:2023-11-29 01:04:48 25 4
gpt4 key购买 nike

这是对先前问题的跟进:Core Data: change delete rule programmatically .

我想重新表述我的问题,并将在此处进行。

简而言之,我的应用程序允许从第 3 方数据库更新条目,但我想保留用户注释。所以我的工作流程是:

  1. 遍历所有实体
  2. 下载外部xml并将其解析为新实体
  3. 如果是用户注释,将他们的关系从旧实体更改为新实体
  4. 删除旧实体

在导入过程中,旧实体在主上下文中,新实体在临时导入上下文中。数字 3 给我带来了问题,如果我只是改变关系,那么如果我更新我的用户界面,它们就不会显示。如果我使用 objectID 获取注释,然后按如下方式更改关系:

    NSManagedObjectID *objectId = oldAnnotation.objectID;
Annotation *newAnnotation = [importContext objectWithID: objectId];
[newEntry addAnnotationObject: newAnnotation];

它仍然无法正常工作 - 它没有显示。

编辑:如果我将第二行的上下文更改为 newEntry.managedObjectContext,我会得到一个Illegal attempt to establish a relationship 'foo' between objects in different contexts错误。

我错过了什么?

更新:经过一些深夜的紧张调试,我发现我在获取 newEntry 时实际上是在获取 oldEntry,因此不会显示任何更改。 @Mundi 下面的回答为我指明了正确的方向。

使用我上面的代码复制旧注释,然后复制属性。对于一些本身有关系的用户输入,我必须做一个“深拷贝”,我在这里找到:How can I duplicate, or copy a Core Data Managed Object? .

最佳答案

我认为创建新实体并删除旧实体是一种有问题的策略。您应该尝试正确地更新现有实体,并且仅在它们尚不存在时才创建新实体。

每当我需要来自不同上下文的对象时,我都会获取它。话虽如此,您的对象 ID 代码应该可以工作。但是,可能还有其他各种故障,您应该检查一下:

  • 您是否保存了 importContext?
  • 您是否保存了它的父上下文,大概是主上下文?
  • 是否将修改后的对象图保存到持久存储中?
  • 您是否在保存后检查结果?

关于ios - 将 NSManagedObject 的关系更改为不同的上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36534354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com