【问题标题】:Swift CoreData: Inserting instances of an Entity related to other 2 entitiesSwift CoreData:插入与其他 2 个实体相关的实体实例
【发布时间】:2014-09-09 11:19:58
【问题描述】:

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

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

Station是指一个电动阀,Program是一个浇水程序(数据库中可以有N个程序),StationProgram在Program中有一个表示Station浇水时间的属性。

关键是我可以在数据库中(在它们各自的视图控制器中)正确地创建 Station 和 Program 的实例。但是,我有一个 TableViewController ,对于在前一个控制器中选择的给定站,我想显示所有可用的程序,并带有一个 UISwitch 指示该程序是否已与该站相关联。最初,电台和节目之间没有关联。用户可以与数据库中的所有现有程序进行交互,并为此站激活它们(将指向该程序的表行中显示的 UISwitch 设置为打开)。最后,当用户想保存配置时,我想将数据插入到表 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)

}

具体来说,执行在“newStationProgramInstance.toStation = station as Station”行崩溃。它说 swift_dynamicCastClassUnconditional 在

线程 1:EXC_BREADKPOINT(代码=EXC_I386_BPT,子代码=0x0)

非常感谢您的帮助。

【问题讨论】:

    标签: ios core-data swift


    【解决方案1】:

    在 Core Data 中,您可以使用多对多关系而不是单独的连接表来模拟这种关系。

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

    使用连接表的唯一正当理由是,如果您想添加和保留有关关系本身的附加信息(例如 dateCreated 或类似信息)。我怀疑你的情况是否如此。

    现在关系的创建变得微不足道。如果模型设置正确且具有反向关系,只需一种方式就足够了。

    newStation.addProgramsObject(newProgram)
    

    【讨论】:

    • 对。这是我最初设计的解决方案。但是,正如您所说,我需要额外的信息,即 wateringTime 属性。该属性属于关系本身,表示该站为关联节目洒水的分钟数。因此,该程序处于活动状态的星期几,在程序开始时,该站的电动阀将工作“wateringTime”分钟。
    • 每个节目的分钟数是可变的吗?该信息是否应该不是 Program 的属性,即如果洒水分钟不同,则应该有不同的 Program?
    • 您在哪里以及如何定义station?如果它是Station 类型,则无需强制转换。在您的代码中您没有创建它 - 可能您忘记了 Station(entity:en insertInto...) 的行吗?
    • 谢谢你,蒙迪。实际上,站点来自父控制器,因为用户已经从站点列表中选择了一个来配置它。然后,在当前控制器中,出现程序集。用户必须选择要为此站激活的程序,并为其分配浇水时间。我已经编辑了问题以插入模型类的代码(它们位于单独的 .swift 文件中,但我将所有内容放在一起)。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    相关资源
    最近更新 更多