核心数据:我的托管对象上的托管对象上下文为零

Posted

技术标签:

【中文标题】核心数据:我的托管对象上的托管对象上下文为零【英文标题】:Core Data: nil managed object context on my managed object 【发布时间】:2011-09-14 20:50:04 【问题描述】:

我正在使用 2 个托管对象上下文在后台有效地处理大型数据集。我确保我在线程中一次只使用 1 个托管对象上下文。

NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];
[context setPersistentStoreCoordinator:[self persistentStoreCoordinator]];

MetricType *metricType = [self metricTypeForName:self.metricName fromContext:context];

NSLog(@"metric context %@", [metricType managedObjectContext]);

[self processDataInContext:context forMetric:metricType];

在上面的代码片段中,NSLog 正确打印出我正在使用的 managedObjectContext 的地址。然后我继续处理 processDataInContext - 这只是一个私有方法,用于交互 json 数据数组并添加对象。每个对象都与 MetricType 有关系。

但是,当我去关联它们时

metric.metricType = metricType;

我收到错误:非法尝试在不同上下文中的对象之间建立关系“metricType”....即使我确保我不这样做。

当我在此行之前进行日志输出时:

NSLog(@"My Context %@", context);
NSLog(@"metric context %@", [metricType managedObjectContext]);

metricType 上下文返回 nil!!

它是如何变成空的?我没有取消它,这似乎是它抱怨的原因。

【问题讨论】:

【参考方案1】:

我想通了

[context reset]; 

..每 50 条记录被调用一次,这当然是从上下文中删除了我的 metricType 对象并且我没有重新获取它。

【讨论】:

【参考方案2】:

您初始化 metricType 的方式看起来很可疑。 [self metricTypeForName:fromContext:] 实际上做了什么来返回一个 MetricType 实例?您是否正在使用 [[MetricType alloc]init] 创建新的 MetricType?我怀疑你在自动释放池中返回一些东西

【讨论】:

不,没有什么可疑的事情发生。我使用标准核心数据获取从存储中获取一个对象,如果它不存在,我使用标准核心数据技术创建它。无论如何,我的答案如下:我正在重置上下文。

以上是关于核心数据:我的托管对象上的托管对象上下文为零的主要内容,如果未能解决你的问题,请参考以下文章

如何在托管对象上下文之外使用核心数据对象?

核心数据查询在托管对象上下文中插入新对象

核心数据:托管对象与上下文一起保存后如何撤消操作

在核心数据中保存到托管对象上下文时的 SIGABRT

核心数据获取...为啥在将托管对象插入上下文 A 并保存上下文 A 后,不使用上下文 B 获取托管对象?

托管对象上下文作为单例?