2017-09-23 110 views
1

我試圖獲取父項的所有子項。Swift - CoreData NSPredicate - 獲取父項的子項

在我的情況下,父母是一個實體AgendaEvent,它有很多議程日程(孩子)。

所以這裏是我的功能:

func getRelatedAgendaEvent(event: AgendaEvent) ->NSFetchRequest<AgendaDate> { 
    // create a fetch request that will retrieve all the AgendaDate. 
    let fetchRquest = NSFetchRequest<AgendaDate>(entityName: "AgendaDate") 

    // set the predicate to only keep AgendaDate related with the AgendaEvent selected 
    fetchRquest.predicate = NSPredicate(format: "parent == %@", event) 

    return fetchRquest 
} 

,我用這個在didselectRow了的tableView:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    var eventToPass: AgendaEvent! 
    var eventDateToPassArray: [AgendaDate]! 

    eventToPass = myTempEvents[indexPath.row] 
    eventDateToPassArray = try! context.fetch(getRelatedAgendaEvent(event: eventToPass)) 
    DispatchQueue.main.async {() -> Void in 
     self.performSegue(withIdentifier: "EventToModify", sender: eventToPass) 
    } 
} 

}

我想在SEGUE使用eventDateToPassArray。 我得到的錯誤是:

keypath parent not found in entity <NSSQLEntity AgendaDate id=1> with userInfo of (null) 

我不知道這是正確的道路。我試圖在用戶編輯AgendaEvent時更新NSSet(AgendaDate)。因此,基本上在更新和AgendaEvent時,用戶還會更新相關AgendaData NSSet中的日期。

謝謝!

------------- UPDDATE

馬丁你的意思是這樣的:

AgendaDate + CoreDataProperties.swift

extension AgendaDate { 

@nonobjc public class func fetchRequest() -> NSFetchRequest<AgendaDate> { 
    return NSFetchRequest<AgendaDate>(entityName: "AgendaDate") 
} 

@NSManaged public var agendaDates: NSDate? 
@NSManaged public var agendaEvents: AgendaEvent? 

}

AgendaDate + CoreDataClass.swift

import Foundation 
import CoreData 

@objc(AgendaDate) 
public class AgendaDate: NSManagedObject { 

} 
+0

您爲eventDateToPassArray指定一個值,但永遠不會使用* it。 –

+0

@MartinR我知道....我打印只是爲了看結果..但我得到那個錯誤 – Marco

+0

顯示'AgendaDate'是如何定義的。哪裏*究竟*你會得到錯誤? –

回答

1

獲取請求中使用的關鍵路徑必須實際名稱的核心數據關係的 ,你的情況符合「agendaEvents」, 沒有隱含的「父」的關係:

fetchRquest.predicate = NSPredicate(format: "agendaEvents == %@", event) 

更妙的是,使用#keyPath%K膨脹

fetchRquest.predicate = NSPredicate(format: "%K == %@", 
            #keyPath(AgendaDate.agendaEvents, event) 

所以該編譯器檢查鍵路徑的有效性。 這有助於避免使用未知的鍵路徑或拼寫錯誤。

請注意,一個更好的關係名稱將是「agendaEvent」 或只是「事件」,與單數形式爲一對一的關係。