创建NSManagedObject而不保存?

时间:2012-04-15 22:10:07

标签: ios objective-c core-data nsmanagedobject nsmanagedobjectcontext

  

可能重复:
  Store But Don't Save NSManagedObject to CoreData?

我需要制作NSManagedObject而不保存它,我该怎么做?

我想要这样做的原因是应用程序有一个设置,用户输入他们的详细信息,但是我只想保存对象,如果他们完成设置(他们可以选择取消,在这种情况下对象需要在不保存的情况下丢弃,这就是为什么我不想直接插入它。)

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

我尝试了以下内容:

GuestInfo *guest;
guest = (GuestInfo *)[NSEntityDescription insertNewObjectForEntityForName:@"GuestInfo" inManagedObjectContext:nil];

这会导致崩溃,并显示以下错误消息:

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

4 个答案:

答案 0 :(得分:14)

我建议创建托管对象并正常插入托管对象上下文。您将引用托管对象,即:

GuestInfo* guest = (GuestInfo *)[NSEntityDescription insertNewObjectForEntityForName:@"GuestInfo" inManagedObjectContext:managedObjectContext];

然后,如果用户取消,只需从托管对象上下文中删除它,如下所示:

[guest deleteInContext:managedObjectContext];

托管对象上下文被设计为一个暂存器,您可以像这样在其中创建和删除对象。

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

[managedObjectContext rollback]

如果用户取消。即,您将在托管对象上下文中创建托管对象,但如果用户取消,则将托管对象上下文的状态撤消或回滚到上次保存时的状态。请参阅Apple的“使用托管对象”文档的“撤消管理”部分:

https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CoreData/Articles/cdUsingMOs.html

答案 1 :(得分:7)

创建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.
}];

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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