Ios 保存到多个实体-核心数据-Swift
希望这会有意义 我试图将数据从一个函数存储到两个不同的实体中,但在将数据存储到第二个实体中时运气不佳 我的两个实体称为-作业&检查表 我已经创建了一个核心数据管理器,我将其剥离回来,以便向您展示我正在使用的部分:Ios 保存到多个实体-核心数据-Swift,ios,swift,core-data,Ios,Swift,Core Data,希望这会有意义 我试图将数据从一个函数存储到两个不同的实体中,但在将数据存储到第二个实体中时运气不佳 我的两个实体称为-作业&检查表 我已经创建了一个核心数据管理器,我将其剥离回来,以便向您展示我正在使用的部分: struct CoreDataManager { static let shared = CoreDataManager() let persistentContainer: NSPersistentContainer = { // initialization of co
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)
}
}
}
当我试图保存数据时,作业实体(第一个实体)写入上下文,我可以在另一个类中获取它
我试图保存到ShootKit清单中的数据来自一个数组,因此我将设置值放入for look中。但是,它似乎忽略了将任何数据保存到实体
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)
提前谢谢你,帮了大忙 好的,我通过在协议中添加另一个函数并在委托中添加实体来修复它(我意识到我以前没有分享过这个(抱歉)。这是我的新协议:
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)
}
感谢您的帮助!在
HandleSave
中,您创建了一个新的作业和一个新的ShootKitChecklist
,没有任何连接。那么这个新创建的作业如何知道任何skc?您有一个for循环,它正在修改一个skc
对象。您想为它插入一个单独的skc吗thenarray中的每个条目?@Paulw11-是的,我正在尝试将SKCequipment数组中的每个条目写入ShootKit检查表实体,因此您需要在for循环中分配一个新的SKC实体实例。另外,有什么原因不使用CoreData为您创建的NSManagedObject子类吗?另外,返回元组有点麻烦。哟ur函数应该返回一个可选值,并简单地抛出一个错误