9

可能重复:
存储但不将 NSManagedObject 保存到 CoreData?

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

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

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

我尝试了以下方法:

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

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

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

4 回答 4

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

于 2012-04-16T11:49:02.323 回答
7

创建一个 NSManagedObjectContext,作为正常上下文的子级。您可以在那里进行所有您想要的更改,只要您不调用保存,那里的东西就不会被推送。

例如...

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.
}];
于 2012-04-15T22:34:29.557 回答
0

托管对象总是需要有一个上下文。如果您不希望对象持久化,只需不要保存上下文。

如果您从不希望您的对象是持久的,那么您是否应该真正使用 Core Data 是值得怀疑的。

于 2012-04-16T01:06:30.297 回答
-1

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

于 2012-04-15T23:25:43.373 回答