gpt4 book ai didi

swift - 如何在 Core Data 和 NSPredicate 中仅获取一对多关系的子集

转载 作者:行者123 更新时间:2023-11-30 12:12:50 25 4
gpt4 key购买 nike

这让我发疯......

我有一个涉及事件的模型(每个事件与 RecordEntries 具有一对多关系),如下所示:

Event <---recordEntries--->> RecordEntry

我想要做的是获取一个事件以及与特定年龄组、性别和省份匹配的所有关联记录条目(过滤掉不匹配的记录条目)。需要明确的是,我需要 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 是正确的 - 在获取事件时,其 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 方法中触发错误(这将使急切加载成为一件毫无意义的事情)。

在我找到更好的东西之前,看起来这将是我的解决方案......

关于swift - 如何在 Core Data 和 NSPredicate 中仅获取一对多关系的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45839489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com