已插入但尚未保存的 NSManagedObject?

Posted

技术标签:

【中文标题】已插入但尚未保存的 NSManagedObject?【英文标题】:NSManagedObjects that have been inserted but not yet saved? 【发布时间】:2015-01-18 15:48:42 【问题描述】:

可以识别(在运行时)NSManagedObjects,这些NSManagedObjects 已插入到NSManagedObjectContext(即inserted == YES)中,但到目前为止从未将saved 插入到上下文的存储中。

我最初以为他们的objectID 可能仍然是nil,但事实并非如此。

更新我进行了一个快速实验,看看检查temporaryID(请参阅accepted answer)是否也适用于嵌套 MOC。这表明不可以:保存子 MOC 只会向上推一层(即到父 MOC,但不是到更上一层的持久存储),因此新插入的 MOC 的对象 ID 仍然是临时的。在这种情况下,确定 MO 在子 MOC 中是否是新的并且从未保存(甚至没有保存到父 MOC)的一种方法显然是检查[child objectRegisteredForID: object.objectID] && ![parent objectRegisteredForID: object.objectID]

【问题讨论】:

【参考方案1】:

你可以使用temporaryIDproperty的NSManagedObjectID:

如果接收器是临时的,则为是,否则为否。大多数对象 ID 返回 不。插入托管对象上下文的新对象被分配一个 临时 ID,一旦对象被替换为永久 ID 保存到持久存储中。

示例用法:

if(object.objectID.isTemporaryID) 
  //the object has not been saved yet

【讨论】:

您知道该方案是否也可以扩展到嵌套的托管对象上下文 (MOC)。例如,我假设如果我第一次保存一个子 MOC,它的 MO 仍然会有临时 ID,因为保存只被推上一层(因此到父 MOC,而不是持久存储)?是否还有办法找到从未保存的子 MOC 的 MO(甚至没有保存到父 MOC)?也许通过insertedObjects?如果您愿意,我可以发布一个单独的问题。 会做实验,然后也许会做。我刚刚在别处读到“对于子 MOC,父 MOC 是持久存储”。所以也许它真的就像对嵌套 MOC 使用相同的策略一样简单。 已完成实验(并更新问题)。

以上是关于已插入但尚未保存的 NSManagedObject?的主要内容,如果未能解决你的问题,请参考以下文章

NSManagedObject 中未保存的 NSSet 成员是不是会在保存时保留已删除的成员?

知道 NSManagedObject 实例是新的并且尚未持久化的最简单方法是啥?

插入的 NSManagedObject 无法保存时会发生啥情况?

NSManagedObject 保存或插入检查

避免获取已删除的 NSManagedObject

核心数据:NSManagedObject 何时插入上下文并保存?