创建但不保存 NSManagedObjects
Posted
技术标签:
【中文标题】创建但不保存 NSManagedObjects【英文标题】:Creating but not saving NSManagedObjects 【发布时间】:2015-10-20 19:06:14 【问题描述】:所以我创建了 NSManagedObject 的子类,现在我想创建一个实例的临时克隆,但不想保存克隆。我该怎么做?
这是一个粗略的例子,其中 Person 是 NSManagedObject 的子类。
Person *billy = [Person initWithStuff:stuff];
我们初始化billy,并将billy保存到上下文中。
Person *bobby = billy;
bobby.name = @"Bobby";
我们创建bobby,修改一个属性。
但现在我不想将对 bobby 的修改保存到 billy,也不想将 bobby 保存到上下文中。
我该怎么做?
【问题讨论】:
【参考方案1】:首先,不要这样称呼比利。你不是在做一个克隆,你只是在内存中创建另一个指向同一个对象的指针。
如果你想创建一个 new Person
实体,那么你需要使用正确的初始化器创建它,然后将属性从 billy 复制到 bobby。从那里您可以使用新的 bobby Person
。保存由您决定。
【讨论】:
【参考方案2】:您想要做的是对象的副本。你所做的是创建第二个指针,它指向同一个对象。 您要做的第二件事是创建一个没有上下文的 NSManagedObject。
要正常复制对象,您可以使用方法 copyWithZone 实现 NSCopying 协议,但这是不可能的,因为 NSManagedObject 不使用正常的构造函数。
你可以做的是实现你自己的复制方法。
Person.m
- (id)copy
// Create object
Person *copiedPerson = (Person *)[NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:nil];
// Now copy all properties
copiedPerson.name = self.name;
// return object
return copiedPerson;
现在你可以这样了。
Person *billy = [Person initWithStuff:stuff];
Person *bobby = [billy copy];
bobby.name = @"Bobby";
【讨论】:
我很想知道您为什么创建copiedPerson
而不是NSManagedObjectContext
。它不需要存在吗?
通常你在任何时候调用 context.save 并且所有实体都将被存储,但在他提到的问题中,他不想存储副本,为此我将 nil 作为参数传递,这将禁止调用 context.addEntity,这是在内部完成的以上是关于创建但不保存 NSManagedObjects的主要内容,如果未能解决你的问题,请参考以下文章