'对多关键在这里不允许'例外,但为什么?

问题描述:

我建立一个地图应用有以下实体:'对多关键在这里不允许'例外,但为什么?

enter image description here

enter image description here

协调,地图是对一个地图坐标是一个一对多的关系。

而且我的代码是:

fileprivate var fetchedResultsControllerForMapEntity: NSFetchedResultsController<Map> = { 
// Create Fetch Request 
let fetchRequest: NSFetchRequest<Map> = Map.fetchRequest() 

// Configure Fetch Request 
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)] 
fetchRequest.predicate = NSPredicate(format:"newRelationship == %@", "peachesfarm") 

// Create Fetched Results Controller 
let fetchedResultsControllerForMapEntity = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: managedObjectContext, sectionNameKeyPath: nil, cacheName: nil) 

return fetchedResultsControllerForMapEntity 
}() 

fileprivate var fetchedResultsControllerForCoordinateEntity: NSFetchedResultsController<Coordinate> = { 
// Create Fetch Request 
let fetchRequest: NSFetchRequest<Coordinate> = Coordinate.fetchRequest() 

// Configure Fetch Request 
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "latitude", ascending: true)] 
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "longitude", ascending: true)] 

// Create Fetched Results Controller 
let fetchedResultsControllerForCoordinateEntity = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: managedObjectContext, sectionNameKeyPath: nil, cacheName: nil) 

return fetchedResultsControllerForCoordinateEntity 
}() 

我基本上是试图检索名为“peachesfarm”只有地图的坐标。为什么我会得到这个异常?

+0

' newRelationship'混淆不清,你应该命名关系'Map' - >'Coordinate' **坐标**(表示 - >很多)和反向关系'Coordinate' - >'Map' ** map **(表示 - >一个)。然后创建'NSManagedObject'子类并使用属性。 – vadian

+0

好的,但是我的代码/ db有什么问题? – konyv12

+0

要获取具有给定名称的地图的所有坐标,必须在“坐标”和谓词“map.name ==%@”(在您的术语中:“newRelationship.name =%@”)上创建一个提取请求,并且而不是相反。 –

NSPredicate(format:"newRelationship == %@", "peachesfarm") 

给出了一个错误,因为“newRelationship”是一个一对多的关系,这 不能平等进行比较。

要获取与给定名称的地图相关的所有坐标, 必须使用“坐标”的获取请求,而不是“地图”。 然后使用关键路径指向相关地图的名称。使用 关系名称由@vadian如上文所建议的将是

let fetchRequest: NSFetchRequest<Coordinate> = Coordinate.fetchRequest() 
let predicate = NSPredicate(format: "map.name == %@", "peachesFarm") 
fetchRequest.predicate = predicate 

更妙的是,使用#keyPath指令,在编译器检查 属性名称,从而避免错误:

let predicate = NSPredicate(format: "\(#keyPath(Coordinate.map.name)) == %@", "peachesFarm") 
+0

非常感谢。我有一个问题:我怎样才能使“peachesfarm”动态?例如,一个保存这些信息但位于上述函数之外的变量? – konyv12

+0

@ konyv12:你可以用一个字符串变量替换文字字符串:'NSPredicate(format:“map.name ==%@”,mapName)' –