gpt4 book ai didi

ios - 如何删除子托管对象上下文上的临时对象?

转载 作者:行者123 更新时间:2023-11-29 03:16:24 24 4
gpt4 key购买 nike

我有一个 CodeData 模型 [Phone]<<--->>[Forwarding]。所以 Phone 对象有一个 Forwardings 集,反之亦然。

我有一个电话列表,想将其中一个添加到新的转发中。

ForwardingViewController 中,我这样做:

// Create a new managed object context; set its parent to the fetched results controller's context.
managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[managedObjectContext setParentContext:[fetchedResultsController managedObjectContext]];
self.forwarding = (ForwardingData*)[NSEntityDescription insertNewObjectForEntityForName:@"Forwarding"

因此这将创建一个子 MOC 和一个现在临时的转发。

然后我将 self->forwarding 传递给我的 PhonesViewController,它显示所有电话(在表格中)。这个 View Controller 是简单的导航推送。

当用户点击表格中的一部手机时,我会:

[self.forwarding addPhonesObject:phone];

addPhonesObject 是 CoreData 生成的访问器。

现在,当用户回到 ForwardingViewController 并点击取消按钮(因为他决定他根本不想创建一个新的转发)时,它被取消,这清理了这个子 managedObjectContextself.forwarding

完成上述操作后,出现数据库错误(Cocoa 错误 1550)。当试图理解控制台输出时,我的猜测是 Forwarding 确实被删除了,但是 Phone 对象(当然仍然存在)现在对这个已删除的 Forwarding 有一个空引用。

我的问题。我应该如何正确处理这种情况:在子 MOC 上创建一个临时对象,将其链接到另一个对象(在父 MOC 上),然后再次删除该临时对象。

最佳答案

您遇到的实际错误是什么?

根据您的描述,我猜测您的 PhonesViewController 列出的电话来自与您创建 ForwardingData 实体的电话不同的 NSManagedObjectContext从。这违反了与 Core Data 的关系规则。规则很简单,要在两个实体之间创建关系,它们必须都来自同一个 NSManagedObjectContext 实例。

我质疑您为什么要在这种情况下创建一个临时的 NSManagedObjectContext。由于您保留了 ForwardingData 实体并且您知道何时被取消,因此在按下取消时删除临时实体似乎更干净,而不是建立另一个 NSManagedObjectContext

更新

如果您需要使用 child (根据您的评论),那么您应该更改您的 PhonesViewController 以通过依赖注入(inject)接受 NSManagedObjectContext。然后,您可以向其发送与用于创建新实体的实例相同的 NSManagedObjectContext 实例。通过该更改,一切都会按您预期的方式运行。

关于ios - 如何删除子托管对象上下文上的临时对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21650818/

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