3 回答
TA贡献1806条经验 获得超8个赞
注意:此答案很旧。查看评论以获取完整历史记录。此后,我的建议已更改,我不再建议使用未关联的NSManagedObject实例。我当前的建议是使用临时子NSManagedObjectContext实例。
原始答案
最简单的方法是创建NSManagedObject没有关联的实例NSManagedObjectContext。
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:myMOC];
NSManagedObject *unassociatedObject = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:nil];
然后,当您要保存它时:
[myMOC insertObject:unassociatedObject];
NSError *error = nil;
if (![myMoc save:&error]) {
//Respond to the error
}
TA贡献1886条经验 获得超2个赞
iOS5为Mike Weller的答案提供了更简单的选择。而是使用子 NSManagedObjectContext。它消除了通过NSNotificationCenter蹦床的需要
创建子上下文:
NSManagedObjectContext *childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
childContext.parentContext = myMangedObjectContext;
然后使用子上下文创建对象:
NSManagedObject *o = [NSEntityDescription insertNewObjectForEntityForName:@"MyObject" inManagedObjectContext:childContext];
仅在保存子上下文时应用更改。因此,放弃更改只是不保存。
关系仍然存在限制。即您不能在其他上下文中创建与对象的关系。为了解决这个问题,可以使用objectID来从子上下文中获取对象。例如。
NSManagedObjectID *mid = [myManagedObject objectID];
MyManagedObject *mySafeManagedObject = [childContext objectWithID:mid];
object.relationship=mySafeManagedObject;
注意,保存子上下文将更改应用于父上下文。保存父上下文将保留更改。
TA贡献1801条经验 获得超8个赞
实现此类目标的正确方法是使用新的托管对象上下文。使用相同的持久性存储创建托管对象上下文:
NSManagedObjectContext *tempContext = [[[NSManagedObjectContext alloc] init] autorelease];
[tempContext setPersistentStore:[originalContext persistentStore]];
然后添加新对象,对其进行突变等。
当需要保存时,您需要在tempContext上调用[tempContext save:...],并处理save通知以将其合并到原始上下文中。要丢弃这些对象,只需释放此临时上下文并忽略它即可。
因此,当您保存临时上下文时,更改将保存到存储中,而您只需要将这些更改恢复到您的主上下文中即可:
/* Called when the temp context is saved */
- (void)tempContextSaved:(NSNotification *)notification {
/* Merge the changes into the original managed object context */
[originalContext mergeChangesFromContextDidSaveNotification:notification];
}
// Here's where we do the save itself
// Add the notification handler
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(tempContextSaved:)
name:NSManagedObjectContextDidSaveNotification
object:tempContext];
// Save
[tempContext save:NULL];
// Remove the handler again
[[NSNotificationCenter defaultCenter] removeObserver:self
name:NSManagedObjectContextDidSaveNotification
object:tempContext];
这也是您应该处理多线程核心数据操作的方式。每个线程一个上下文。
如果您需要从此临时上下文访问现有对象(以添加关系等),则需要使用对象的ID来获取新的实例,如下所示:
NSManagedObject *objectInOriginalContext = ...;
NSManagedObject *objectInTemporaryContext = [tempContext objectWithID:[objectInOriginalContext objectID]];
如果您尝试NSManagedObject在错误的上下文中使用,则保存时会出现异常。
- 3 回答
- 0 关注
- 534 浏览
添加回答
举报