Hi would like to duplicate an object from my core data db. Right now I'm using
movement2 = [NSEntityDescription
insertNewObjectForEntityForName:@"Movement"
inManagedObjectContext:self.managedObjectContext];
movement2.name = movement.name;
movement2.value = movement.value;
movement2.date = movement.date;
...
and it works. but...
Is there any way to copy all the values of movement
to movement2
, in one line of code?
There's no method in the API to copy
NSManagedObjects
, since they don't conform toNSCopying
, nor toNSCoding
. This makes sense considering that it's often not clear how you would want to copy such an object if it has relationships: should it have relations to the same objects, or copies of them? What about those copies? These are difficult questions whose answers probably depend on the nature of the relationships (to-many or to-one), and hence on the specific use cases of Core Data.So short answer: I'd do what you're doing in your snippet, or maybe write a method to make a copy. It looks like your
NSManagedObject
s only have simple attributes and no relationships, so it should be straightforward.NSManagedObject, unlike NSObject, provides an API to iterate over its attributes and relationships. Or, rather, it's entity description does. It isn't a one-liner, though.
See the documentation for more details.
This will be enough to clone most of the objects. If database structure is correct, then copying relationships this way, their inverse ones will be updated as well. So, if your Movement had a relationship with, say, MovementDirection, and MovementDirection has an inverse 1-to-many relation
parentMovements
, thisparentMovements
set will have bothmovement
andmovement2
inside after you call the code above.I've made a rudimentary duplicate extension for NSManagedObject (based on @coverback's answer). Use with care (though for me it works so far)
Swift 4: