2017-04-12 142 views
0

我建立一個地圖應用有以下實體:'對多關鍵在這裏不允許'例外,但爲什麼?

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 =%@」)上創建一個提取請求,並且而不是相反。 –

回答

1
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)' –