CoreData - отношение один ко многим

Я выложу следующий код, затем объясню мою борьбу

Эта функция сохраняет день (например, воскресенье, понедельник, вторник и т. Д.):

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

Мое приложение работает нормально, но на самом деле мне нужно вот что: для каждого ДНЯ у меня будет несколько упражнений Names, 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 ответ

Решение

Документация о том, что вы хотите сделать, находится по этой ссылке под заголовком "Отношения ко многим".

Вот короткий пример. Во-первых, я рекомендую изменить имена ваших отношений на что-то более интуитивное. Это действительно поможет:

class TrainingDay: NSManagedObject {
    @NSManaged var day: String
    @NSManaged var trainingDetails: NSSet
}

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

Убедитесь, что любые изменения, которые вы вносите в код, также вносятся в график модели. Убедитесь, что отношения настроены так, чтобы быть обратными друг другу в графе модели.

Вы можете установить TrainingDay для данного TrainingDetails как это:

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

Базовые данные также заботятся о создании обратных отношений, поэтому trainingDay1 объект будет автоматически добавлен details к его trainingDetails задавать.

Если вы пытаетесь добавить объекты в trainingDetails установить в TrainingDay, вам нужно использовать mutableSetValueForKey: Метод описан в документации, с которой я связан. В основном это выглядит так:

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

mutableSetValueForKey: создает объект прокси. Любые изменения, внесенные в набор, который он возвращает, вступают в силу для набора, который вы пытаетесь изменить.

Надеюсь это поможет!

Другие вопросы по тегам