我想使用Trainingdate.day/month/year在练习表中查询其训练日期的训练日期。 我想使用这样的谓词但不能让它起作用。
拥有这样的多对多关系或者在两者之间使用映射表会更好吗?
var dontAdd = false
// check if trainingdate already existst
let fetchRequest1 = NSFetchRequest(entityName: kExercises)
fetchRequest1.predicate = NSPredicate(format: "ANY trainingdatesRel.day==%i && ANY trainingdatesRel.month==%i && ANY trainingdatesRel.year==%i",day,month,year)
fetchRequest1.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
let results1 = managedObjectContext.executeFetchRequest(fetchRequest1, error: nil) as! [Trainingdates]
if results1.count > 0 {
dontAdd = true
}
答案 0 :(得分:1)
问题是CoreData分别评估每个ANY子句。因此,例如,如果您正在寻找2015年8月30日,它将检查它是否有Trainingdates
:
但是匹配每个的Trainingdate
可能会有所不同。如果Exercise
在 30 2013年7月,1 8月 2014年和6月2日 2015 时有Trainingdates
,则会匹配
您需要使用SUBQUERY;然后,它将一次评估每个Trainingday
的所有条件:
fetchRequest1.predicate = NSPredicate(format: "SUBQUERY(trainingdatesRel, $date, $date.day==%i && $date.month==%i && $date.year==%i).@count > 0", day,month,year)
此处$date
是一个占位符,依次代表每个Trainingdate
(来自trainingdatesRel
关系)。