swift - CoreData - 一对多关系

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

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

此函数保存一天(如星期日、星期一、星期二等):

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!")
        }
    }

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

这是我的两个模型:

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。这就是为什么我需要设置这个一对多的关系。

我怎样才能做到这一点?

如有错误请见谅。提前致谢!!

最佳答案

您想要执行的操作的文档是 in this link ,在“对多关系”标题下。

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

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: 创建一个代理对象。对它返回的集合所做的任何更改都对您尝试修改的集合有效。

希望对您有所帮助!

关于swift - CoreData - 一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32013330/

相关文章:

javascript - 来自共享或操作扩展 ios 的网络请求

ios - 使用 NSThread 生成线程时如何解决 "target does not implement selector"这个异常?

ios - [String : AnyObject] be an AnyObject, 但 [String : AnyObject? ] 怎么可能不行?

ios - Apple 在核心数据的上下文中将什么称为对象图?

objective-c - 来自核心数据和外部源的模型对象

postgresql - 更新一对多关系中的重复项。

php - Symfony2 : Warning: spl_object_hash() expects parameter 1 to be object, 整数给定

swift - 字典映射认为一个字符串是一个字符串数组

objective-c - 使用 SQL 直接从我的数据库中删除 CoreData 数据

java - JPA 一对多和多对一 : Error NULL not allowed for column