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 - 一对多关系的主要内容,如果未能解决你的问题,请参考以下文章