Ios 是否创建NSManagedObject而不保存?

Ios 是否创建NSManagedObject而不保存?,ios,objective-c,core-data,nsmanagedobject,nsmanagedobjectcontext,Ios,Objective C,Core Data,Nsmanagedobject,Nsmanagedobjectcontext,可能重复: 我需要创建一个NSManagedObject而不保存它,我如何才能做到这一点 我想这样做的原因是应用程序有一个设置,用户在其中输入他们的详细信息,但是我只想在他们完成设置后保存对象(他们可以选择取消,在这种情况下,需要放弃对象而不保存,这就是我不想立即插入它的原因) 我尝试在没有上下文的情况下插入一个,但应用程序崩溃了 我尝试了以下方法: GuestInfo *guest; guest = (GuestInfo *)[NSEntityDescription insertNewObj

可能重复:

我需要创建一个NSManagedObject而不保存它,我如何才能做到这一点


我想这样做的原因是应用程序有一个设置,用户在其中输入他们的详细信息,但是我只想在他们完成设置后保存对象(他们可以选择取消,在这种情况下,需要放弃对象而不保存,这就是我不想立即插入它的原因)

我尝试在没有上下文的情况下插入一个,但应用程序崩溃了

我尝试了以下方法:

GuestInfo *guest;
guest = (GuestInfo *)[NSEntityDescription insertNewObjectForEntityForName:@"GuestInfo" inManagedObjectContext:nil];
这会导致崩溃,并显示以下错误消息:

'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name 'GuestInfo''

创建NSManagedObjectContext,作为普通上下文的子级。你可以在那里做你想要的所有更改,只要你不调用save,那里的东西就不会被推送

例如

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType: NSPrivateQueueConcurrencyType];
moc.parentContext = myCurrentManagedObjectContext;
现在,从程序中的任何线程中,您都可以进行以下调用

[moc performBlock:^{
    // Do anything you want to with this context... make a new object, whatever.
    // As long as you do not call [moc save], your changes will not propagate
    // up to the parent context, nor saved.
}];

如果您不想保存核心数据对象,那么创建它有点奇怪……但无论如何,错误表明您的项目中没有名为GuestInfo的模型文件。验证它是否存在并包含在“复制捆绑包资源”部分中。模型文件用于声明数据库中的类型以及它们之间的连接。

托管对象始终需要有上下文。如果不希望对象持久化,只需不保存上下文即可


如果您从不希望对象持久化,那么您是否应该实际使用核心数据是值得怀疑的。

我建议您创建托管对象,并像往常一样插入托管对象上下文。您将有一个对托管对象的引用,即:

GuestInfo* guest = (GuestInfo *)[NSEntityDescription insertNewObjectForEntityForName:@"GuestInfo" inManagedObjectContext:managedObjectContext];
然后,如果用户取消,只需将其从托管对象上下文中删除,如下所示:

[guest deleteInContext:managedObjectContext];
托管对象上下文被设计为一个草稿行,您可以像这样在其中创建和删除对象

您可以考虑的另一个选项是:

[managedObjectContext rollback]
如果用户取消。i、 e.您可以在托管对象上下文中创建托管对象,但如果用户取消,您可以撤消或回滚托管对象上下文的状态,使其恢复到上次保存时的状态。请参阅苹果“使用托管对象”文档的“撤消管理”部分:


为什么不向我们展示您的代码?如果您不需要持久化该对象,那么您实际使用该对象的目的是什么?你能不能用同一个接口创建另一个对象?如果你想插入一个NSManagedObject,那么你需要有一个上下文来放入它。但是,我同意@Paul.s我想这样做的原因是应用程序有一个设置,用户在其中输入他们的详细信息,但是我只想在他们完成设置后保存对象(他们可以选择取消,在这种情况下,需要丢弃对象而不保存,这就是为什么我不想立即插入它)。请原谅,我是CoreData的新手,我尝试了第一位,但遇到以下问题时崩溃:
“父NSManagedObjectContext必须使用NSPrivateQueueConcurrencyType或NSMainQueueConcurrencyType”。
。然后,尝试这种方法,我得到一个错误,说在声明performWork的上下文中没有可见的接口。具体来说,您是如何创建“当前”主运行中心的?如果您仅使用alloc/init,请尝试使用alloc/initWithCurrencyType:NSMainQueueConcurrencyType创建它,如果您的应用程序仅使用主线程,这将很好。关于绩效工作。。类型。我在答案中修正了它。使用私有上下文来创建可能是暂时的托管对象比将对象插入到主上下文中,然后在不需要时删除它要好得多(正如当前公认的答案所示)。除了干净的设计之外,这种方法还带来了许多其他好处。导致此错误的原因实际上是
insertNewObjectForEntityForName:inManagedObjectContext:
方法根据其上下文参数(此处为
nil
)推断模型。这并不一定意味着模型文件不存在。@天哪,我的意思是它不以正在查找的形式存在……但我承认我确实忽略了上下文是nil^^;如果我必须始终使用上下文,那么为什么在调用
insertNewObjectForEntityForName:inManagedObjectContext:
时,它会立即使用空值将对象添加到CoreData中?我想创建对象,但不保存它,除非用户稍后确认。那么?在托管对象上下文中插入对象不会保存它。您必须通过调用
save:
明确地执行此操作。我认为这是错误的?当我在ManagedObjectContext中使用insertNewObjectForEntityForName:inManagedObjectContext,然后(在调用save之前!)对coredata执行提取时,对象显示出来。@KevingRather提取请求可以返回尚未保存的对象。引用:“如果在上下文上执行提取请求,则检索满足请求(…)指定的条件且已插入到上下文中但尚未保存到持久存储的对象。”