如何在太多关系中要求多个价值观

时间:2015-08-30 07:34:56

标签: swift core-data

enter image description here

我想使用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
        }

1 个答案:

答案 0 :(得分:1)

问题是CoreData分别评估每个ANY子句。因此,例如,如果您正在寻找2015年8月30日,它将检查它是否有Trainingdates

  • 30日(任何月/年),
  • 八月(任何一天/一年)和
  • 2015年(任何日/月)。

但是匹配每个的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关系)。