我有一个包含以下实体的应用程序:Station、Program和StationProgram:

Station <-->> StationProgram <<--> Program

Station是指一个电动阀,Program是一个浇水程序(数据库中可以有N个程序),StationProgram有一个属性,指示一个程序中一个站点浇水的时间。
关键是我可以在数据库中(在各自的视图控制器中)正确地创建站点和程序的实例。但是,我有一个TableViewController,其中,对于在前一个控制器中选择的给定电台,我想显示所有可用的程序,并有一个ui开关指示此程序是否与电台关联。最初,电台和节目之间没有关联用户可以与DB中的所有现有程序进行交互,并将它们激活到该站(设置表中显示的UISwitCH指向程序到ON)。最后,当用户想保存配置时,我想在table StationProgram中插入数据。现在,为了简化,我只想手动分配一个时间,例如,2分钟,给活动的程序。我有以下代码,但当我尝试映射此代码时,执行将崩溃:
@IBAction func saveTapped(sender: AnyObject) {
// Reference to our app delegate
 let appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate

 // Reference moc
 let context: NSManagedObjectContext = appDel.managedObjectContext!
 let en = NSEntityDescription.entityForName("Station", inManagedObjectContext: context)
 station.setValue(textFieldStationName.text as String, forKey: "name")

 let en2 = NSEntityDescription.entityForName("StationProgram", inManagedObjectContext: context)

 // The variable activePrograms contains the row of the table where this program is shown, and the wateringTime
 for (selectedCellId,time) in activePrograms {
     var newStationProgramInstance = StationProgram(entity: en2, insertIntoManagedObjectContext: context)
     let program: NSManagedObject = programList[selectedCellId] as NSManagedObject
     // Map our properties
     newStationProgramInstance.wateringTime = time

     // station is a variable of type Station that is filled from the previous controller
     newStationProgramInstance.toStation = station as Station
     newStationProgramInstance.toProgram = program as Program
  }

  context.save(nil)
  self.navigationController.popViewControllerAnimated(true)

}
具体来说,在“newstationprogramminstance.toStation=station as station”行执行崩溃。上面说swift_dynamiccastclass无条件
线程1:EXC_BREADKPOINT(代码=EXC_I386_BPT,子代码=0x0)
非常感谢你的帮助。

最佳答案

在核心数据中,您将使用多对多关系(而不是单独的联接表)来建模这种关系。

Station (programs) <<----->> (stations) Program

使用联接表的唯一正当理由是,您是否希望添加并保留有关关系本身的其他信息(如dateCreated或类似信息)。我怀疑你的情况是这样的。
这种关系的建立现在变得微不足道了。如果模型是用相反的关系正确设置的,那么只需要一种方法就足够了。
newStation.addProgramsObject(newProgram)

关于ios - Swift CoreData:插入与其他2个实体相关的Entity的实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25743330/

10-10 16:11