我对swift和核心数据都很陌生 . 所以如果这个逻辑没有意义,请告诉我 .
我正在尝试将用户的图像保存到核心数据,并能够删除所选的图像 . 我有实体“媒体”,属性“照片”类型“二进制数据”
在这里,我将UIImage转换为NSData
let data = UIImagePNGRepresentation(addedImage!) as NSData?
并保存它 .
let newPhoto = NSEntityDescription.insertNewObject(forEntityName: "Media", into: context)
newPhoto.setValue(imageData, forKey: "photo")
在这里,我尝试使用谓词从核心数据中检索一个选定的图像
func deleteImage(imageData: NSData) {
let context = appDelegate.persistentContainer.viewContext
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Media")
request.returnsObjectsAsFaults = false
request.predicate = NSPredicate(format: "photo =%@", imageData)
do {
let results = try context.fetch(request)
...
我收到此错误消息 .
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[OS_dispatch_data _bytesPtrForStore]: unrecognized selector sent to instance
保存并从实体“媒体”获取所有图像非常有效 . 我只是无法得到具体的一个 .
有什么想法/建议?谢谢 .
2 回答
保存这样的图像,并为该属性启用外部存储, can 即可 . 但是这里有一些非常不寻常的事情 .
常见的方法是使图像成为具有其他信息的实体的一部分,但不作为实体的主要 Value . 例如,表示人并且具有姓名,地址等和图片的实体类型 . 在实体中存储 just a picture 有点奇怪 . 您're not getting much of anything from using Core Data over something simpler. If nothing else I' d猜测您在实体中有照片ID, Headers 或其他一些数据 .
第二件事与此有关 - 尝试使用基于二进制数据属性的谓词来获取是极其罕见的 . 我猜它 might 工作,但前提是你可以确保谓词值与持久存储中的谓词值完全相同 - 而不是二进制blob中的单个位更改 . 这可能是真的,但我从来没有见过那个特定的错误信息,但是我没有工作 .
最后,基于获取请求删除对象也是不寻常的(尽管不像上面那么奇怪) . 您可以在获取图像之前获取这些对象 . 为什么再次获取同一个对象只是为了删除它?删除已经提取的那个 .
更可靠的方法是至少在实体中包含唯一ID,可以是整数或UUID或其他适合您的ID . 获取此实体并使用
photo
属性显示图像 . 如果要删除一个,请从fetch中获取托管对象,并告诉上下文删除该文件 . 或者,如果由于某种原因需要提取,请使用谓词中的唯一ID而不是二进制数据 .你最好停止这样做 . 当您有更多记录时,将大量数据(图像,音频,视频等)保存到核心数据将大大降低获取速度 . 而是将图像保存到application folder,然后仅将其URL保存到核心数据 .