iVentis
iVentis

Reputation: 1153

get rid of temporary saved managedObjectContext

how can I manage temporary saved CoreData? as soon as I do something like this:

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

it is part of my managedObjectContext and will be saved when i do a context.save(nil) Is there any way to get an object of the NSManagedObject Class without messing with my current context. In other words: I want to have optional objects that just end up unused when I don't save them explicitly and i want to have objects that I really want to save persistently.

Upvotes: 0

Views: 900

Answers (3)

oyalhi
oyalhi

Reputation: 3994

This answer is late but hopefully helps someone else out there. Yes there is. You create a child context. Do anything you want there. If you want to keep your changes, save the child context - which does NOT persist data. It notifies parent context of the changes, the changes are now in your main context. You can then perform save on the main context.

    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

to let the main context know that you want to keep your changes:

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

when you want to NOT keep your changes you can reset:

    childContext.reset()

when you want to persist the changes on the main context you do as always:

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

Upvotes: 4

Brett
Brett

Reputation: 4391

You can delete the objects from the managed context before you call context.save, which prevents them from being committed. Assuming you have an NSManagedObjectContext called context and an instance of MyClass called myClass, then the following will work:

context.deleteObject(myClass)

See:

NSManagedObjectContext.deleteObject

Discussion

... If object has not yet been saved to a persistent store, it is simply removed from the receiver.

Of course the decision about which objects to save and which to discard are up to the logic of your application. So before you call save, you need to check all of the inserted, but not yet, committed instances that are registered with the NSManagedObjectContext you're using. You can keep track of that in your application, or perhaps this will be of use:

NSManagedObjectContext.insertedObjects

The set of objects that have been inserted into the receiver but not yet saved in a persistent store. (read-only)

Upvotes: 0

Jignesh Agola
Jignesh Agola

Reputation: 320

There is no direct way u can get rid of updated object what you can do is update it again with real data (which is previous data before updating). whenever you update object of 'NSManagedObject' (core data entity object) 'NSManagedObjectContext' captures all the changes and it saves whenever you do save context.

In this type of use case better to use Sqlite database.

Upvotes: 2

Related Questions