保存到多个实体中 - 核心数据 - Swift

Posted

技术标签:

【中文标题】保存到多个实体中 - 核心数据 - Swift【英文标题】:Saving into multiple entities - Core Data - Swift 【发布时间】:2018-09-03 20:34:20 【问题描述】:

希望这会有意义。

我正在尝试将数据从一个函数存储到 2 个不同的实体中,但在将数据存储到第二个实体时运气不佳。

我的 2 个实体被称为 - JobShootKitChecklist

我创建了一个核心数据管理器,我已将其剥离,只是为了向您展示我正在使用的部分:

struct CoreDataManager 

static let shared = CoreDataManager()

let persistentContainer: NSPersistentContainer = 
    // initialization of core data stack
    let container = NSPersistentContainer(name: "TBAShootCoreData")
    container.loadPersistentStores  (storeDescription, error) in
        if let error = error 
            fatalError("loading of store failed: \(error)")
        
    
    return container
()

func createSKCItem(item: String, used: Bool, visible: Bool, job: Job) -> (ShootKitChecklist?, Error?) 
    let context = persistentContainer.viewContext
    // create Shoot kit item
    let SKC = NSEntityDescription.insertNewObject(forEntityName: "ShootKitChecklist", into: context) as! ShootKitChecklist

    SKC.job = job

    SKC.setValue(item, forKey: "item")
    SKC.setValue(used, forKey: "used")
    SKC.setValue(visible, forKey: "visible")

    do 
        try context.save()
        return (SKC, nil)
     catch let error 
        print ("Failed to add Shoot Kit Item:", error)
        return (nil, error)
    

当我尝试保存数据时,Job 实体(First Entity)会写入上下文,我可以在另一个类中获取它。

我试图保存到 ShootKitChecklist 的数据来自一个数组,所以我将我的 setValues 放入一个 for 中。但是,它似乎忽略了将任何数据保存到实体。

var SKCequipment = ["A","B","C","D","E"]

@IBAction private func HandleSave(sender : UIButton) 



        let context = CoreDataManager.shared.persistentContainer.viewContext

        let job = NSEntityDescription.insertNewObject(forEntityName: "Job", into: context)
        let SKC = NSEntityDescription.insertNewObject(forEntityName: "ShootKitChecklist", into: context)

        job.setValue(jobBrandTextField.text, forKey: "jobBrand")
        job.setValue(jobNameTextField.text, forKey: "jobName")
        job.setValue(directorTextField.text, forKey: "directorName")
        job.setValue(agencyTextField.text, forKey: "agencyName")
        job.setValue(prodCoTextField.text, forKey: "prodCoName")


        for item in SKCequipment 
            print(item)
            SKC.setValue(item, forKey: "item")
            SKC.setValue(true, forKey: "used")
            SKC.setValue(true, forKey: "visible")
        

        do 
            try context.save()
            dismiss(animated: true) 
                self.delegate?.didAddJob(job: job as! Job)
            
         catch let saveError 
            print("Failed to save company:", saveError)
        
    

为了测试项目是否已添加到核心数据中,我正在获取这样的项目:

guard let SKCitem = job?.skc?.allObjects as? [ShootKitChecklist] else  return
self.skcitems = SKCitem
print(skcitems)

提前谢谢你,巨大的帮助!

【问题讨论】:

HandleSave 中创建一个新的Job 和一个新的ShootKitChecklist,没有以任何方式连接。那么这个新创建的job 应该如何知道任何 skc? 您有一个 for 循环正在修改一个 SKC 对象。您想为 thenarray 中的每个条目插入一个单独的 SKC 吗? @Paulw11 - 是的,我正在尝试将 SKCequipment 数组中的每个项目写入 ShootKitChecklist 实体 所以需要在for循环内部分配一个新的SKC实体实例。另外,您是否有任何理由不使用 CoreData 为您创建的 NSManagedObject 子类? 另外,返回一个元组有点恶心。你的函数应该返回一个可选的并且简单地抛出一个错误 【参考方案1】:

好的,我已经通过在我的协议中添加另一个函数并将实体附加到委托中来修复它(我意识到我之前没有分享过这个(抱歉)。这是我的新协议:

protocol NewJobControllerDelegate 
    func didAddJob(job : Job)
    func didAddSKC(SKC : ShootKitChecklist)

然后在我的 HandleSave 操作中,我将 for 循环更改为:

for item in SKCequipment 
            let tuple = CoreDataManager.shared.createSKCItem(item: item, used: true, visible: true, job: job as! Job)
            if let error = tuple.1 
                print("Cannot save items", error)
             else  
                self.delegate?.didAddSKC(SKC: tuple.0!)
            

最后是我委托的新功能:

func didAddSKC(SKC: ShootKitChecklist) 
        ShootKit.append(SKC)
    

感谢您的帮助!

【讨论】:

以上是关于保存到多个实体中 - 核心数据 - Swift的主要内容,如果未能解决你的问题,请参考以下文章

核心数据保存和加载到多个实体

如何将来自多个视图控制器的数据保存到单个核心数据实体中

核心数据添加和检索到多个表如何

iOS 8 Swift - 保存多个实体的数据

Swift 中的核心数据:仅在 for 循环中保存最后一个对象

保存具有多个不同关系的相同类型的各种核心数据实体?