2016-05-05 45 views
0

我有一个名为Geometry的实体,它与Plot实体有关。在我们的一段代码中,给定Plot和一些下载的数据存储在NSDictionary中,我们必须得到Geometry并设置一些NSString属性,但是在这样做后,我发现实体之间的关系丢失了。编辑嵌套对象后,核心数据关系丢失

NSError * saveError = nil; 

NSFetchRequest * request = [[NSFetchRequest alloc] initWithEntityName:[Geometry entityName]]; 
request.predicate = [NSPredicate predicateWithFormat:@"plot == %@", plot]; 
NSError * error = nil; 
NSArray * results = [context executeFetchRequest:request error:&error]; 

Geometry * __block geometry = nil; 

if ([results count] > 0) { 
    [results enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL * stop) { 
     Geometry * geometryObject = obj; 
     if ([geometryObject.gid isEqualToString:[NSString stringWithFormat:@"%@", [data valueForKey:@"gid"]]]) { 
      geometry = geometryObject; 
      stop = YES; 
     } 
    }]; 
} 

if (geometry != nil) { 
    [geometry setPolygon:[NSString stringWithFormat:@"%@", [data valueForKey:@"polygon"]]]; 
} 

if (![context save:&saveError]) { 
    NSLog(@"%@", saveError); 
} 

我第一次运行该代码results有一个对象,但下一次我运行这个没有results

假设这段代码的范围之外的所有内容都正常工作。任何暗示或线索为什么发生这种情况?我该如何解决这个问题?

编辑:该问题已被解决超出了代码范围,并且超出了本问题的范围。我应该进一步正确地审查代码。

+0

为什么要枚举结果而不是修改谓词以首先返回单个'Geometry'对象? – Avi

+0

@Avi如果有多个结果,它们将在此代码的范围之外进行处理。 – JordiVilaplana

回答

1

你的代码中没有任何东西可以打破关系。该错误必须在其他地方。

你有Plot对象,这样你就可以得到plot.geometries几何不为获取请求,没有环路滤波器他们:

Geometry *geometry = [plot.geometries 
    filteredArrayUsingPredicate: [NSPredicate predicateWithFormat:@"gid = %@", gidString]] 
    .firstObject 

其中geometriesplot的反比关系的名称。

您现在可以设置polygon属性并保存。如果您没有删除关系,请检查您的setPolygon方法。

+0

感谢您的回复,@Mundi。不幸的是,问题已经以另一种方式解决了。记住引号'假设我的问题中,这段代码的范围之外的所有内容都正常工作?请不要认为,我不应该。 upvoted因为它有助于改善我的代码。 – JordiVilaplana

+1

我更新了答案,以便您可以接受并解决此问题。 – Mundi