【问题标题】:CoreData - One-to-many relationshipCoreData - 一对多关系
【发布时间】:2015-08-14 15:14:39
【问题描述】:

我将发布以下代码,然后解释我的挣扎

此函数可节省一天(如星期日、星期一、星期二等):

func appendDaysToArray() {
        let dayLabel = dayName.text
        daysArray.append(dayLabel)

        let dayEntity = NSEntityDescription.entityForName("TrainingDay", inManagedObjectContext: moc!)
        let trainingday = TrainingDay(entity: dayEntity!, insertIntoManagedObjectContext: moc)
        trainingday.day = dayName.text

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

        if let err = error {
            var status = err.localizedFailureReason
            println("\(status)")
        } else {
            println("Day #\(dayName.text) saved successfully!")
        }
    }

这个将细节保存为名称、组数和重复次数(如健身练习):

func appendTrainingDetails () {

        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("Exercise: #\(exerciseName.text) saved successfully!")
            println("Number of sets: #\(setsNumber.text) saved successfully!")
            println("Number of reps: #\(repsNumber.text) saved successfully!")
        }
    }

我的应用程序运行正常,但我真正需要的是:对于每一天,我将有多个练习名称、setsNumber 和 repsNumber。我设置了一对多的关系,但我不知道如何将 TrainingDetails 归因于 daysArray 中的每一天。

这是我的 2 个模型:

import Foundation
import CoreData

class TrainingDay: NSManagedObject {

    @NSManaged var day: String
    @NSManaged var relationship1: NSSet

}

import Foundation
import CoreData

class TrainingDetails: NSManagedObject {

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

}

稍后,我将为每一天设置一个按钮,当按下时,他们将使用该特定日期的练习列表更新 tableView。这就是为什么我需要设置这种一对多的关系。

我怎样才能做到这一点?

如有任何错误,我们深表歉意。提前致谢!!

【问题讨论】:

    标签: swift core-data one-to-many nsfetchedresultscontroller relationships


    【解决方案1】:

    您想要做的事情的文档是in this link,在“To-Many Relations”标题下。

    这是一个简短的例子。首先,我建议将您的关系名称更改为更直观的名称。这真的很有帮助:

    class TrainingDay: NSManagedObject {
        @NSManaged var day: String
        @NSManaged var trainingDetails: NSSet
    }
    
    class TrainingDetails: NSManagedObject {
        // ... other stuff here
        @NSManaged var trainingDay: TrainingDay
    }
    

    确保您对代码所做的任何更改也在模型图中进行。确保关系在模型图中配置为彼此相反。

    您可以像这样为给定的TrainingDetails 设置TrainingDay

    // This assumes you've created a TrainingDay called "trainingDay1", and a 
    // TrainingDetails object called "details".
    details.trainingDay = trainingDay1
    

    Core Data 也负责创建反向关系,因此trainingDay1 对象会自动将details 添加到其trainingDetails 集合中。

    如果您尝试将对象添加到TrainingDay 中的trainingDetails 集,则需要使用我链接到的文档中描述的mutableSetValueForKey: 方法。基本上,它看起来像这样:

    var details = trainingDay1.mutableSetValueForKey("trainingDetails")
    details.addObject(newTrainingDetails)
    

    mutableSetValueForKey: 创建一个代理对象。对它返回的集合所做的任何更改都对您尝试修改的集合有效。

    希望这会有所帮助!

    【讨论】:

    • 我将您的答案标记为正确的,但我仍有一些疑问。你有任何其他社交媒体,如 facebook 或 whatsapp 可以让我们交谈吗?我真的很想掌握这种关系的东西。
    • 我马上给你发电子邮件
    猜你喜欢
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多