【问题标题】:Swift 3 - Core Data Saving with one-to-many relationshipSwift 3 - 具有一对多关系的核心数据保存
【发布时间】:2017-07-08 11:05:03
【问题描述】:

我正在处理核心数据,我有两个实体:

游泳池 参数 每个游泳池可以有多个参数

我已经保存并获取了游泳池的数据。

我已经通过表格保存了它们。

在我的 AppDelegate 中有:

let ad = UIApplication.shared.delegate as! AppDelegate
let context = ad.persistentContainer.viewContext

这是函数:

 var swimmingpool: SwimminPool!

    if swimmingPoolToEdit == nil {
        swimming = SwimminPool(context: context)
    } else {
        swimming = swimmingPoolToEdit
    }

    if let name =  swimmingName.text {
        swimming.name = name
    }
    if let volume = swimmingVolume.text {
        swimming.volume = volume
.........................................................
ad.saveContext()

然后我像这样执行获取:

var controller: NSFetchedResultsController<SwimmingPool>!

func attemptFetch() {

    let fetchRequest: NSFetchRequest<SwimminPool> = SwimminPool.fetchRequest()
    let dataSort = NSSortDescriptor(key: "createdAt", ascending: false)

    fetchRequest.sortDescriptors = [dataSort]

     let controller = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)

    controller.delegate = self
    self.controller = controller

    do {
        try controller.performFetch()
    } catch {
        let error = error as NSError
        print("\(error.debugDescription)")
    }
}

通过一个 segue,我将所有数据传递给一个新控制器,并通过一个新表单(在另一个控制器中),我试图保存参数数据并将它们连接到特定的游泳池。

我是否需要像保存游泳池一样保存数据,并且关系会自动连接两个实体,还是我需要在保存时连接它们?

我是 swift 新手,不知道如何保存相关数据

连接将在保存或何时执行参数获取时建立?

谢谢!

【问题讨论】:

    标签: ios swift core-data


    【解决方案1】:

    创建Parameter托管对象,然后将此参数链接到SwimingPool托管对象:

    let parameter = Parameters(context: context)
    parameter.chlorum = Double(12245454.12211) // insert your value
    parameter.oxigen = "your value here"
    parameter.createdAt = "your value here"
    
    let swimming = SwimminPool(context: context)
    swimming.parameter = parameter
    ad.saveContext()
    

    【讨论】:

      【解决方案2】:

      如果要将Parameters 添加到特定的SwimmingPool

      • 在 segue 中将特定的 SwimmingPool 实例传递给表单控制器。
      • 通过将Parameters 实例插入上下文来创建它们。
      • 通过在parameter 属性/关系上调用insertNSManagedObject 子类的生成访问器addToParameter 将关系添加到SwimmingPool 实例。
      • 保存上下文。 (作为最后步骤很重要)。

      注意:为避免混淆,Entity 始终以单数形式命名(例如 SwimmingPool / Parameter),一对一关系也以单数形式(例如 parameter)和一对一关系命名- 复数形式的许多关系(例如parameters

      PS:你的问题是模棱两可的:你在写每个游泳池可以有多个参数但是模型设计是每个参数可以有多个游泳池

      【讨论】:

      • 谢谢!!!!我想我做到了....如果我可以再问一个问题,那就太好了...现在可以正常获取这些数据了吗?我是说就像我为水族馆做的那样?还是我必须指定关系?
      • 您可以获取Swimmingpool 记录并从parameter 属性/关系中获取参数,或者获取Parameter 记录并从swimmingPool 属性/关系中获取它们的池。跨度>
      • 好的,我想我明白了...我稍后再试!手指交叉!谢谢!
      • 我确信它是正确的......我的错误我必须改变模型而不是......我必须让每个游泳池都有很多参数......现在应该是正确的: image 对吗?
      • 是的,但是 - 再一次 - 您应该以复数形式命名 一对多关系 (parameters)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-24
      • 2016-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多