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:
создает объект прокси. Любые изменения, внесенные в набор, который он возвращает, вступают в силу для набора, который вы пытаетесь изменить.
Надеюсь это поможет!