gpt4 book ai didi

swift - NSData 变量不保存到 CoreData

转载 作者:行者123 更新时间:2023-11-28 13:45:55 24 4
gpt4 key购买 nike

我正在尝试转换用户从相机胶卷导入的图像,将图像转换为 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.")
}
}

这就是我在其他类(class)中的称呼方式

最佳答案

主要问题是您正在将 Data 转换为 UIImageView,这是行不通的。

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

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

  • 使用原生 Swift 类型(例如 Data)声明 NSManaged 对象,并尽可能避免可选类型。
  • 始终使用点符号来访问 CoreData 属性,而不是容易出错的 KVC
  • 如果您要访问特定实体,请始终使用特定的 NSFetchRequest

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)
}
}

关于swift - NSData 变量不保存到 CoreData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55382247/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com