'对多关键在这里不允许'例外,但为什么?
我建立一个地图应用有以下实体:'对多关键在这里不允许'例外,但为什么?
协调,地图是对一个地图坐标是一个一对多的关系。
而且我的代码是:
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”只有地图的坐标。为什么我会得到这个异常?
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")
非常感谢。我有一个问题:我怎样才能使“peachesfarm”动态?例如,一个保存这些信息但位于上述函数之外的变量? – konyv12
@ konyv12:你可以用一个字符串变量替换文字字符串:'NSPredicate(format:“map.name ==%@”,mapName)' –
' newRelationship'混淆不清,你应该命名关系'Map' - >'Coordinate' **坐标**(表示 - >很多)和反向关系'Coordinate' - >'Map' ** map **(表示 - >一个)。然后创建'NSManagedObject'子类并使用属性。 – vadian
好的,但是我的代码/ db有什么问题? – konyv12
要获取具有给定名称的地图的所有坐标,必须在“坐标”和谓词“map.name ==%@”(在您的术语中:“newRelationship.name =%@”)上创建一个提取请求,并且而不是相反。 –