摆脱临时保存的managedObjectContext

时间:2014-11-10 11:10:56

标签: ios core-data swift nsmanagedobject nsmanagedobjectcontext

如何管理临时保存的CoreData? 一旦我做了这样的事情:

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

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

3 个答案:

答案 0 :(得分:2)

没有直接的方法你可以摆脱更新的对象,你可以做的是用真实数据(更新前的先前数据)再次更新它。无论何时更新'NSManagedObject'(核心数据实体对象)的对象,'NSManagedObjectContext'都会捕获所有更改,并在保存上下文时保存。

在这种用例中更好地使用Sqlite数据库。

答案 1 :(得分: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 :(得分:0)

您可以在调用context.save之前从托管上下文中删除对象,这会阻止它们被提交。假设您有一个名为NSManagedObjectContext的{​​{1}}和一个名为context的{​​{1}}实例,则以下内容将有效:

MyClass

请参阅:

  

NSManagedObjectContext.deleteObject

     

<强>讨论

     

...如果对象尚未保存到持久性存储中,则只需将其从接收方中删除。

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

  

NSManagedObjectContext.insertedObjects

     

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