【发布时间】:2017-08-23 12:16:27
【问题描述】:
这把我逼疯了……
我有一个涉及事件的模型(每个事件与 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
]
...这也返回了事件的所有记录(包括那些我不想要的)。
我在这里错过了什么?!?
【问题讨论】:
-
request.predicate = NSPredicate(format: "ANY (recordEntries.ageGroup == %i AND recordEntries.gender == %@ AND recordEntries.province IN %@)" ageGroupCode, the rest)代替? -
如果你的意思是这样:
let recordsPredicate = NSPredicate(format: "ANY (recordEntries.ageGroup == %i AND recordEntries.gender == %@ AND recordEntries.province IN %@)", ageGroupCode, userGender, ["CA", userProvince]),这将失败(无法解析格式字符串...)。 -
如果只使用这个谓词 let recordAgePredicate = NSPredicate(format: "recordEntries.ageGroup == %i", ageGroupCode),是不是只取ageGroup等于ageGroupCode的记录?
-
@user1000 您建议的谓词导致崩溃,“此处不允许使用多对多键”...
-
@EtienneBeaule 因为您正在获取事件,所以谓词对
recordEntries关系的内容没有影响。如果您想将 recordEntries 关系过滤到您感兴趣的较小集合,请将谓词应用于relatedEntities集合,或者单独获取与相关事件相关的RecordEntry对象并满足您的其他标准。
标签: swift core-data nspredicate