【问题标题】:get rid of temporary saved managedObjectContext摆脱临时保存的 managedObjectContext
【发布时间】:2014-11-10 11:10:56
【问题描述】:

如何管理临时保存的 CoreData? 只要我做这样的事情:

var myClass: MyClass = NSEntityDescription.insertNewObjectForEntityForName("MyClass", inManagedObjectContext: (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext!) as MyClass

它是我的 managedObjectContext 的一部分,当我执行 context.save(nil) 时将被保存 有没有办法在不弄乱我当前上下文的情况下获取 NSManagedObject 类的对象。 换句话说:我希望有一些可选对象,当我没有明确地保存它们时,它们最终不会被使用,并且我希望有我真正想要持久保存的对象。

【问题讨论】:

    标签: ios core-data swift nsmanagedobject nsmanagedobjectcontext


    【解决方案1】:

    这个答案很晚,但希望能帮助其他人。 是的。您创建了一个子上下文。在那里做任何你想做的事。如果 你想保留你的更改,保存子上下文 - 它不会保留数据。它通知父上下文更改,更改现在在您的主上下文中。然后,您可以在主上下文中执行保存。

        let childContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
        childContext.parentContext = mainContext
        guard let myClass = NSEntityDescription.insertNewObjectForEntityForName("MyClass", inManagedObjectContext: childContext) as? MyClass else {
            // something went wrong, handle it here
            return
        }
        // do your thing here
    

    让主上下文知道您要保留更改:

        do {
            try childContext.save()  // does not persist anything, just lets know the parent that we are happy with the changes
        } catch {
            // handle error
        }
    

    当您不想保留更改时,您可以重置:

        childContext.reset()
    

    当您想在主上下文中保留更改时,您将一如既往:

        do {
             try mainContext.save()
        } catch {
             // handle error
        }
    

    【讨论】:

    • 非常感谢......我需要的确切答案。
    【解决方案2】:

    您没有直接的方法可以摆脱更新的对象,您可以做的是使用真实数据再次更新它(这是更新之前的先前数据)。每当您更新“NSManagedObject”(核心数据实体对象)的对象时,“NSManagedObjectContext”都会捕获所有更改,并在您保存上下文时保存。

    在这种类型的用例中最好使用 Sqlite 数据库。

    【讨论】:

    • 感谢您的回答! “用真实数据再次更新”到底是什么意思?
    • 当你不想保存数据时不要保存上下文,但是如果你想保存上下文,因为你可能已经创建了新实体。但是在保存上下文之前,用原始更新你的更新对象数据(这是真实数据)。
    • 但是如何更新对象呢?你的意思是什么类型的物体??
    【解决方案3】:

    您可以在调用context.save 之前从托管上下文中删除对象,这样可以防止它们被提交。假设您有一个名为 contextNSManagedObjectContext 和一个名为 MyClass 的实例 myClass,那么以下将起作用:

    context.deleteObject(myClass)

    见:

    NSManagedObjectContext.deleteObject

    讨论

    ...如果对象还没有被保存到持久存储中,它会从接收者中移除。

    当然,关于保存和丢弃哪些对象的决定取决于您的应用程序的逻辑。因此,在调用 save 之前,您需要检查所有已插入但尚未提交的实例,这些实例已在您正在使用的 NSManagedObjectContext 中注册。您可以在您的应用程序中跟踪它,或者这可能会有用:

    NSManagedObjectContext.insertedObjects

    已插入接收器但尚未保存在持久存储中的对象集。 (只读)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 2013-06-06
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多