swift - NSData 变量未保存到 CoreData
问题描述
我正在尝试转换用户从相机胶卷导入的图像,将图像转换为 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.")
}
}
这就是我在其他班级中的称呼
解决方案
主要问题是您将无法正常工作的数据投射到其中。UIImageView
在该retrieveData
方法中,您必须UIImage
从数据创建一个并将图像分配给图像视图
基本上有一些改进可以提高安全性。
NSManaged
使用原生 Swift 类型(例如)声明对象Data
并尽可能避免使用可选项。- 始终使用点符号来访问 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)
}
}
推荐阅读
- c# - 如何在 SQL 数据库中存储复选框值
- python - Sobel 滤波器的结果很差
- hyperlink - 如何在基于字段的microsoft access中为超链接添加友好名称?
- c# - 将 Button.CommandParameter 绑定到 MVVM 对象以使用相同的 ICommand 到不同的按钮
- django - django 获取上一个网址
- ffmpeg - 如何使用ffmpeg创建一个覆盖到视频中的圆形倒计时指示器?
- bash - 为什么将带引号的字符串传递给 Bash 函数并用作命令参数不能按预期工作?
- navigationbar - SwiftUI:第一次渲染时缺少 navigationBarItems
- pine-script - Pine script : 绘制盘中上午 9 点至 10 点的最高最低价
- html - 是否可以拆分先前通过合并多个单元格创建的 CSS 网格单元格?