ios核心数据回滚
Posted
技术标签:
【中文标题】ios核心数据回滚【英文标题】:ios core data roll back 【发布时间】:2013-08-11 16:25:07 【问题描述】:我使用托管对象上下文的回滚方法来丢弃所做的更改,但遇到了问题: 如果我有不同的视图控制器,并且它们每个都可以对不同的数据库数据进行更改,并且如果第一个控制器执行回滚方法,我不希望它回滚第二个控制器所做的更改。无论如何只回滚特定实体,但不是全部? 还是我应该使用多个托管对象上下文?
【问题讨论】:
【参考方案1】:您不能只回滚NSManagedObjectContext
的部分更改集。做你所说的最好的方法是创建一个新的NSManagedObjectContext
,它是父上下文的子级。保存时,更改会推送到父级(您必须确保保存父级上下文以实际持久保存到磁盘)。此外,如果您以这种方式隔离变更集,您甚至不必在子上下文中调用 rollback
,您可以将它们丢弃。
请注意,要使用NSManagedObjectContext
的父/子关系,您必须使用initWithConcurrencyType:
方法来初始化所有上下文,并且您必须指定NSPrivateQueueConcurrencyType
或NSMainQueueConcurrencyType
。需要注意的是,这会影响您访问上下文的方式。如果您不在使用并发类型为NSMainQueueConcurrencyType
的上下文的主队列上,则必须将与上下文交互的所有方法调用放在一个块中,并将其传递给上下文performBlock:
或performBlockAndWait:
方法.
关于这个主题的文档相当薄。我可以在 WWDC 视频之外找到的唯一参考资料是 this ios 5 release notes document。
【讨论】:
这个解决方案正是我正在寻找的。我还有一个问题。假设是否有从第一个控制器获得的核心数据对象,并且它在父 MOC 中。稍后第二个控制器被推送,它想要编辑子 MOC 中的对象。那么我应该如何将对象移动到第二个 MOC 呢?谢谢。 您必须通过父 MOC 移动新对象。如果您有一个子 MOC 并保存更改,它们会被推送给父级。如果您随后创建同一父级的另一个子 MOC,它将拥有推送给父级的所有内容。如果您有两个同时存在的子 MOC,您可能必须在第一个子保存后重新获取第二个子中的对象。您可以通过再次执行 fetch 请求来做到这一点,可能会将其shouldRefreshRefetchedObjects
属性设置为 YES
。
我的意思是这样的:假设在Controller A中获得了一个objectA,它的MOC是第一个,即objectA.MOC是MOC1。然后我想在控制器 B 中对这个对象进行一些更改,但在 MOC2 中。我想做一些像 objectA.MOC = MOC2 (这不能做,因为 .MOC 是只读的)。那么有没有办法将对象分配给MOC2?因为我不想在 MOC 下再次从数据库表中获取对象,因为选择可能会返回许多共享相同选择条件的对象。
我应该使用类似 objectInChildMOC = (Object *)[ChildContext objectWithID:objectInParentMOC.objectID];??
没错,您不能将一个 MOC 中的 NSManagedObject
实例与另一个 MOC 一起使用。因此,在其他 MOC 中工作时,您必须使用 objectID
检索相同的对象。以上是关于ios核心数据回滚的主要内容,如果未能解决你的问题,请参考以下文章
尝试 开始事务,保存更改 捕获 回滚,开始另一个事务,保存更改 EF 核心