如何处理临时NSManagedObject实例?

我需要创建NSManagedObject实例,对它们进行一些处理,然后将其丢弃或存储到sqlite db。问题是,我无法创建NSManagedObject未连接到的实例,NSManagedObjectContext这意味着在我决定不需要数据库中的某些对象之后,必须以某种方式进行清理。

为了解决这个问题,我使用相同的协调器创建了一个内存中的存储,并使用assignObject:toPersistentStore.Now来放置临时对象,如何确保这些临时对象不会到达数据,而这些数据是我从两家商店的共同点?还是我必须为此任务创建单独的上下文?


UPD:

现在,我正在考虑为内存存储创建单独的上下文。如何将对象从一个上下文移动到另一个上下文?仅使用[context insertObject:]?在这种设置下可以正常工作吗?如果我从对象图中插入一个对象,那么整个图是否也会插入上下文中?


守着一只汪
浏览 511回答 3
3回答

慕森卡

注意:此答案很旧。查看评论以获取完整历史记录。此后,我的建议已更改,我不再建议使用未关联的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}

MM们

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;注意,保存子上下文将更改应用于父上下文。保存父上下文将保留更改。

蝴蝶刀刀

实现此类目标的正确方法是使用新的托管对象上下文。使用相同的持久性存储创建托管对象上下文: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在错误的上下文中使用,则保存时会出现异常。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

iOS