Swift NSData变量未保存到CoreData

Swift NSData变量未保存到CoreData,swift,core-data,Swift,Core Data,我正在尝试转换用户从相机卷导入的图像,将图像转换为NSData,并将其作为二进制数据存储在CoreData中。我已经设法将它转换成二进制并打印出来,但我没有将值存储到核心数据中。我已经设法将字符串和其他值存储到实体的不同属性中,但不管出于什么原因,二进制数据都无法工作 func savingData(savingImage: UIImage){ guard let appDelegate = UIApplication.shared.delegate as? AppDeleg

我正在尝试转换用户从相机卷导入的图像,将图像转换为NSData,并将其作为二进制数据存储在CoreData中。我已经设法将它转换成二进制并打印出来,但我没有将值存储到核心数据中。我已经设法将字符串和其他值存储到实体的不同属性中,但不管出于什么原因,二进制数据都无法工作

func savingData(savingImage: UIImage){


        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
        let managedContext = appDelegate.persistentContainer.viewContext

        let userEntity = NSEntityDescription.entity(forEntityName: "Image", in: managedContext)!

        let data = savingImage.pngData()! as NSData


        if idLabel.text != "" {

            let user = NSManagedObject(entity: userEntity, insertInto: managedContext)
            user.setValue(idLabel.text, forKeyPath: "id")
            user.setValue(descriptionText.text, forKey: "imgdescription")
            user.setValue(confidenceLabel.text, forKey: "confidence")
            user.setValue(data, forKey: "binary")


            do {
                try managedContext.save()
                dataSaved.text = "Your answers have been saved! Click Home to return."


            } catch let error as NSError {
                print("Could not save. \(error), \(error.userInfo)")
                dataSaved.text="Error!"
            }
        }
    }
}
这是我用来存储数据的代码。所有值都保存到核心数据中,这些值可以在下一个类中检索

我已经检查了所有的连接,三次检查了实体和属性的命名,但仍然无法工作

有人知道吗

编辑:属性“二进制”作为“二进制数据”存储在核心数据中

func retrieveData() {

        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }

        let managedContext = appDelegate.persistentContainer.viewContext

        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Image")

        fetchRequest.fetchLimit = 1
        fetchRequest.predicate = NSPredicate(format: "id = %@", valueSelected)
        fetchRequest.sortDescriptors = [NSSortDescriptor.init(key: "id", ascending: false)]

        do {
            let result = try managedContext.fetch(fetchRequest)
            for data in result as! [NSManagedObject] {
                idText.text = data.value(forKey:"id") as? String
                descriptionText.text = data.value(forKey:"imgdescription") as? String
                confidenceText.text = data.value(forKey:"confidence") as? String
                photoView = data.value(forKey:"binary") as? UIImageView
            }

        } catch {

            print("Nothing found.")
        }
    }
func retrieveData(){
让appDelegate=UIApplication.shared.delegate作为?appDelegate else{return}
让managedContext=appDelegate.persistentContainer.viewContext
let fetchRequest=NSFetchRequest(entityName:“图像”)
fetchRequest.fetchLimit=1
fetchRequest.predicate=NSPredicate(格式:“id=%@”,valueSelected)
fetchRequest.sortDescriptors=[NSSortDescriptor.init(键:“id”,升序:false)]
做{
let result=尝试managedContext.fetch(fetchRequest)
对于结果中的数据![NSManagedObject]{
idText.text=data.value(forKey:“id”)作为?字符串
descriptionContext.text=data.value(forKey:“imgdescription”)为?字符串
confidenceText.text=data.value(forKey:“confidence”)作为?字符串
photoView=data.value(forKey:“二进制”)为UIImageView
}
}抓住{
打印(“未找到任何内容”)
}
}

这就是我在另一个类中如何调用它的主要问题是您将数据强制转换到无法工作的UIImageView

retrieveData
方法中,必须从数据创建
UIImage
,并将图像分配给图像视图

基本上有一些提高安全性的改进

  • 使用本机Swift类型(例如,
    Data
    )声明
    NSManaged
    对象,并尽可能避免使用选项
  • 使用始终点表示法访问CoreData属性,而不是容易出错的KVC
  • 如果要访问特定实体,请始终使用特定的
    NSFetchRequest


func retrieveData(){
让appDelegate=UIApplication.shared.delegate为!appDelegate
让managedContext=appDelegate.persistentContainer.viewContext
let fetchRequest=NSFetchRequest(entityName:“图像”)
fetchRequest.fetchLimit=1
fetchRequest.predicate=NSPredicate(格式:“id=%@”,valueSelected)
fetchRequest.sortDescriptors=[NSSortDescriptor(键:“id”,升序:false)]
做{
let images=尝试managedContext.fetch(fetchRequest)
对于图像中的图像{
idText.text=image.id
descriptionContext.text=image.imgdescription
confidenceText.text=image.confidence
如果让imageData=image.binary{
photoView.image=UIImage(数据:imageData)
}
}
}抓住{
打印(“未找到任何内容”,错误)
}
}
func savingData(savingImage: UIImage){

        // don't guard AppDelegate, the app won't even launch if it was missing so this line would be never reached
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let managedContext = appDelegate.persistentContainer.viewContext

        let imageEntity = NSEntityDescription.entity(forEntityName: "Image", in: managedContext)!

        let data = savingImage.pngData()!


        if !idLabel.text.isEmpty {

            let image = NSManagedObject(entity: imageEntity, insertInto: managedContext) as! Image
            image.id = idLabel.text
            image.imgdescription = descriptionText.text
            image.confidence = confidenceLabel.text
            image.binary = data

            do {
                try managedContext.save()
                dataSaved.text = "Your answers have been saved! Click Home to return."

            } catch let error as NSError {
                print("Could not save. \(error), \(error.userInfo)")
                dataSaved.text="Error!"
            }
        }
    }
}
func retrieveData() {

    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let managedContext = appDelegate.persistentContainer.viewContext

    let fetchRequest = NSFetchRequest<Image>(entityName: "Image")
    fetchRequest.fetchLimit = 1
    fetchRequest.predicate = NSPredicate(format: "id = %@", valueSelected)
    fetchRequest.sortDescriptors = [NSSortDescriptor(key: "id", ascending: false)]

    do {
        let images = try managedContext.fetch(fetchRequest)
        for image in images {
            idText.text = image.id
            descriptionText.text = image.imgdescription
            confidenceText.text = image.confidence
            if let imageData = image.binary {
               photoView.image = UIImage(data: imageData)
            }
        }

    } catch {
        print("Nothing found.", error)
    }
}