【问题标题】:Core data delete vs reset核心数据删除和重置
【发布时间】:2017-07-01 06:54:49
【问题描述】:

如果我创建一个核心数据对象,然后决定放弃更改而不是保存它,我应该如何实现?据我所知,以下两种方法都有效:

// 1.

let managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let object = CoreDataObject(context: managedObjectContext)
...
managedObjectContext.reset()

// 2.

let managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let object = CoreDataObject(context: managedObjectContext)
...
managedObjectContext.delete(object)

我应该选择哪一个?

【问题讨论】:

  • 根据 Apple Docs,reset() 是将上下文返回到其基本状态。 “所有接收者的管理对象都被“遗忘”了。如果使用此方法,则应确保同时丢弃​​对使用接收器获取的任何托管对象的引用,因为之后它们将无效。"
  • 你到底想要什么?删除特定数据还是删除所有数据?
  • @Lawliet 是的,使用 reset() 确实给我带来了一些麻烦,因为管理对象上下文正在其他地方使用。
  • 如果您还没有提交更改,我会推荐rollback,因为它“从撤消堆栈中删除所有内容,丢弃所有插入和删除,并将更新的对象恢复到它们最后提交的值”。

标签: ios swift core-data


【解决方案1】:

我从苹果的documentation得到了一些信息:

删除(_:)

指定在提交更改时应从其持久存储中删除的对象。

提交更改后,对象将从唯一表中删除。如果对象还没有被保存到持久存储中,它会从接收者中移除。

reset 的意外崩溃相比,到目前为止,使用delete 方法没有导致任何错误。

【讨论】:

    【解决方案2】:

    当您想放弃更改时,您应该使用重置或回滚。
    如果您想从持久存储中删除(已保存并持久化的记录),您必须使用 delete。
    例如,核心数据中存在一条记录。你获取它并删除它。
    但是您已经获取了一些记录,但您想放弃此获取,您应该使用 reset

    reset:它为您提供了一个干净的 NSManagedObjectContext,其中没有任何对象。
    回滚:它丢弃未保存的更改。
    来自https://developer.apple.com/documentation/coredata/nsmanagedobjectcontext/1506942-rollback

    从撤消堆栈中删除所有内容,丢弃所有插入和 删除,并将更新的对象恢复到上次提交的状态 价值观。

    【讨论】:

    • 你有参考吗?
    • @BrightFuture 看看这个:stackoverflow.com/a/32210346/4468859 但我也会寻找更好的参考。
    • 很好的答案!但是请注意我还没有保存,所以rollback 实际上什么也没做,但很高兴知道:)
    猜你喜欢
    • 2017-03-20
    • 2011-05-12
    • 1970-01-01
    • 2011-01-11
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多