核心数据 - 在一对多关系中分配值

Core Data - Assign values in one-to-many relationship

我会 post 一些代码,然后解释我需要什么。

两个型号:

import Foundation
import CoreData

class TrainingDay: NSManagedObject {

    @NSManaged var day: String
    @NSManaged var trainingDetails: NSSet

}

import Foundation
import CoreData

class TrainingDetails: NSManagedObject {

    @NSManaged var exerciseName: String
    @NSManaged var repsNumber: String
    @NSManaged var setsNumber: String
    @NSManaged var trainingDay: TrainingDay

}

好的,现在我这里有这些方法:

    func appendTrainingDay() {
        let dayLabel = dayName.text
        let dayEntity = NSEntityDescription.entityForName("TrainingDay", inManagedObjectContext: moc!)
        let newTrainingDay = TrainingDay(entity: dayEntity!, insertIntoManagedObjectContext: moc)
        newTrainingDay.day = dayName.text

        var error: NSError?
        moc?.save(&error)

        if let err = error {
            var status = err.localizedFailureReason
            println("\(status)")
        } else {
            println("Training day:\(dayName.text)")
    }
}

   func appendTrainingDetailsToArray () {
        let nameLabel = exerciseName.text
        namesArray.append(nameLabel)
        let numberOfSets = setsNumber.text?.toInt()
        setsArray.append(numberOfSets!)
        let numberOfReps = repsNumber.text?.toInt()
        repsArray.append(numberOfReps!)


        let detailsEntity = NSEntityDescription.entityForName("TrainingDetails", inManagedObjectContext: moc!)
        let trainingdetails = TrainingDetails(entity: detailsEntity!, insertIntoManagedObjectContext: moc)
        trainingdetails.exerciseName = exerciseName.text
        trainingdetails.setsNumber = setsNumber.text!
        trainingdetails.repsNumber = repsNumber.text!

        var error: NSError?
        moc?.save(&error)

        if let err = error {
            var status = err.localizedFailureReason
            println("\(status)")
        } else {
            println("Training day:\(trainingdetails)")
            println("Exercise: #\(exerciseName.text) saved successfully!")
            println("Number of sets: #\(setsNumber.text) saved successfully!")
            println("Number of reps: #\(repsNumber.text) saved successfully!")
        }
    }

它们在这里被触发:

@IBAction func fixDayButton(sender: AnyObject) {
        appendTrainingDay()
    }


    @IBAction func doneButton(sender: AnyObject) {
        appendTrainingDetailsToArray()
        exerciseTableView.reloadData()
    }

完成后,它应该做的是:用户将打印一天,如 "monday",将其保存到核心数据中,并且对于特定的一天,用户将添加许多详细信息对象如他所愿,这将填充一个 tableView。这些对象中的每一个都包含 3 个属性:"exerciseName"、"repsNumber" 和 "setsNumber"。例如,似乎正在发生的事情不是创建单个 "monday" 对象,而是向这个已经存在的对象添加许多详细信息对象,我创建了许多 "mondays" 并且对于每个 "monday",我创建一个细节对象。

我该如何解决这个问题? 我怎样才能在将详细信息保存在核心数据中的方法中,获取我想要的特定日期并用尽可能多的对象填充它?

-> 我已经设置了他们之间的一对多关系和反向关系。

-> 我不知道如何使用与我要搜索的内容相匹配的谓词来发出正确的提取请求。

-> 我是 Swift 的新手,只有一点点 C++ 经验。

如果有人能用例子向我解释如何做到这一点,我将非常非常感激。

设置trainingdetails.trainingDay关系。除非我遗漏了什么,否则你永远不会在任何地方设置这种关系。

编辑:

像这样:

trainingdetails.trainingDay = selectedTrainingDay

要访问 trainingdetails,您只需从 Core Data 中获取日期并执行如下操作:

foreach( TrainingDetails trainingDetails in selectedTrainingDay.trainingDetails) {
   // Do stuff with the trainingDetails

}

在没有更好地理解 UI 和工作流程的情况下,我只是猜测。通常这种事情会有两个 UITableViews - 一个列出天数,当你 select 一天你去另一个列出天数的训练细节。在你的情况下,我猜你有一个日历视图,当你从日历视图中 select 一天时,你会显示 selected 天的培训详细信息列表。