簡體   English   中英

如何僅獲取Core Data和NSPredicate中的多對多關系的子集

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM