创建但不保存 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的主要内容,如果未能解决你的问题,请参考以下文章

Node React,Action到达后端但不保存产品

Node.js:创建存储在变量中的xlsx文件,但不确定如何保存它

空formset传递验证但不保存记录

在 Word 2010 中禁用另存为但不保存

cakephp 保存返回 true 但不保存

核心数据保存但不保存 - 专用队列跳转线程