CoreData - 一对多关系

Posted

技术标签:

【中文标题】CoreData - 一对多关系【英文标题】:CoreData - One-to-many relationship 【发布时间】: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。这就是为什么我需要设置这种一对多的关系。

我怎样才能做到这一点?

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

【问题讨论】:

【参考方案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 可以让我们交谈吗?我真的很想掌握这种关系的东西。 我马上给你发电子邮件

以上是关于CoreData - 一对多关系的主要内容,如果未能解决你的问题,请参考以下文章

CoreData 一对多关系问题

CoreData - 一对多关系

CoreData:一对多关系显示问题

CoreData 与价值的一对多关系

CoreData 获取所有一对多关系

无法使用 Swift 在 CoreData 中访问一对多关系