[英]How to fetch only a subset of to-many relationships in Core Data and NSPredicate
這個讓我發瘋...
我有一個涉及事件的模型(每個事件與RecordEntries有很多關系),如下所示:
Event <---recordEntries--->> RecordEntry
我想要做的是獲取一個事件以及與特定ageGroup,性別和省份匹配的所有關聯的recordEntries(過濾出不匹配的recordEntries)。 明確地說,我需要Event對象,但不需要所有的recordEntries-我只對Event中所有recordEntries的子集感興趣。
所以我嘗試這樣做:
let request = NSFetchRequest<Event>(entityName: "Event")
request.relationshipKeyPathsForPrefetching = ["recordEntries"]
request.predicate = NSPredicate(format: "SUBQUERY(%K, $r, $r.ageGroup == %i AND $r.gender == %@ AND $r.province IN %@).@count > 0", #keyPath(Event.recordEntries), ageGroupCode, userGender, ["CA", userProvince])
...而我最終得到了所有記錄(而不是與ageGroupCode,userGender和[“ CA”,userProvinces]匹配的記錄。
我還嘗試了以下方法:
let recordAgePredicate = NSPredicate(format: "ANY recordEntries.ageGroup == %i", ageGroupCode)
let recordGenderPredicate = NSPredicate(format: "ANY recordEntries.gender == %@", userGender)
let recordProvincePredicate = NSPredicate(format: "ANY recordEntries.province IN %@", ["CA", userProvince])
request.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [
recordAgePredicate, recordGenderPredicate, recordProvincePredicate
]
...,這也返回了該事件的所有記錄(包括我不想要的記錄)。
我在這里想念什么?!?
這個答案歸功於@ user1000,他向我指出了正確的方向(並提供了一些代碼片段供您嘗試)...
事實證明@pbasdf是正確的-在對Event進行訪存時,基於其recordEntries關系的謂詞無效。
@ user1000建議的是在Event類中添加以下方法:
func recordsFilteredFor(ageGroup: Int, province: [String], gender: String) -> Set<RecordEntry>{
let pred = NSPredicate(format: "ageGroup == %i AND province IN %@ AND gender == %@", ageGroup, province, gender)
let result = recordEntries?.filtered(using: pred)
return result as! Set<RecordEntry>
}
有了這個,我可以遍歷事件並通過查看event.recordsFilteredFor(...)
而不是event.recordEntries
來僅訪問所需的記錄。
我尚不清楚這會對性能產生什么樣的影響。 使用此解決方案,我最終仍然會獲取比我所需更多的東西,然后再過濾此內容,但是我沒有太多要處理的記錄。
我把request.relationshipKeyPathsForPrefetching = ["recordEntries"]
,以為我最好是急於加載所有關系,而不是再從recordsFilteredFor方法中獲取它們。 我仍然必須仔細檢查這是否有好處。 一些初步測試表明,我仍然最終在recordsFilteredFor方法中引發了一個錯誤(這會使急切加載變得毫無意義)。
在找到更好的東西之前,看起來這將是我的解決方案...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.