保存到多个实体中 - 核心数据 - Swift
Posted
技术标签:
【中文标题】保存到多个实体中 - 核心数据 - Swift【英文标题】:Saving into multiple entities - Core Data - Swift 【发布时间】:2018-09-03 20:34:20 【问题描述】:希望这会有意义。
我正在尝试将数据从一个函数存储到 2 个不同的实体中,但在将数据存储到第二个实体时运气不佳。
我的 2 个实体被称为 - Job 和 ShootKitChecklist。
我创建了一个核心数据管理器,我已将其剥离,只是为了向您展示我正在使用的部分:
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的主要内容,如果未能解决你的问题,请参考以下文章