核心数据自动保存并永久保存NSManagedObjectID和子ManagedObjectContext

时间:2019-11-06 08:39:55

标签: core-data

我有以下简单的用例:

  • 一个NSTableView,用户可以在其中添加新条目。在核心数据中创建一个Entry对象,并预先填充计算值。
  • 当用户双击行时,它将打开一个详细视图,用户可以编辑Entry对象的字段。
  • 然后用户可以单击“保存”或“取消”以保存/放弃更改。

要实现“取消/放弃”更改,我在“详细视图”中使用了子级NSManagedObjectContext(在显示之前,该子级接收Entry对象)。代码是:

// Create child MOC
self.managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
self.managedObjectContext.parent = self.parentManagedObjectContext

guard let entryInChildContext = try? self.managedObjectContext.existingObject(with: self.entry.objectID) as? Entry else {
        // Display error message
}
// Switch to the new context
self.entry = entryInChildContext

问题

如果新创建的objectID尚未保存到持久性存储中,则Entry可以是临时的。在这种情况下,无法在子MOC中找到该条目。

我尝试了什么但没用

  • 在主要ManagedObjectContext中保存(调用save()):导致自动保存出现问题(NSPersistentDocument.autoSavesInPlace返回true)。更多详细信息here
  • 调用managedObjectContext.obtainPermanentIDs(for: [newEntry]),但会引起与前面的项目符号中所述相同的问题。在子MOC上调用它也不起作用。

那么,在这种情况下,我如何使用子托管对象上下文?我真的希望有一个永久的对象ID,因为Entry实体没有自己的唯一字段。

在此先感谢您的帮助!

0 个答案:

没有答案