为了账号安全,请及时绑定邮箱和手机立即绑定

如何处理临时NSManagedObject实例?

如何处理临时NSManagedObject实例?

iOS
守着一只汪 2019-10-05 13:20:06
我需要创建NSManagedObject实例,对它们进行一些处理,然后将其丢弃或存储到sqlite db。问题是,我无法创建NSManagedObject未连接到的实例,NSManagedObjectContext这意味着在我决定不需要数据库中的某些对象之后,必须以某种方式进行清理。为了解决这个问题,我使用相同的协调器创建了一个内存中的存储,并使用assignObject:toPersistentStore.Now来放置临时对象,如何确保这些临时对象不会到达数据,而这些数据是我从两家商店的共同点?还是我必须为此任务创建单独的上下文?UPD:现在,我正在考虑为内存存储创建单独的上下文。如何将对象从一个上下文移动到另一个上下文?仅使用[context insertObject:]?在这种设置下可以正常工作吗?如果我从对象图中插入一个对象,那么整个图是否也会插入上下文中?
查看完整描述

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

}


查看完整回答
反对 回复 2019-10-05
?
MM们

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;

注意,保存子上下文将更改应用于父上下文。保存父上下文将保留更改。



查看完整回答
反对 回复 2019-10-05
?
蝴蝶刀刀

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在错误的上下文中使用,则保存时会出现异常。


查看完整回答
反对 回复 2019-10-05
  • 3 回答
  • 0 关注
  • 508 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信