将 UIImage 保存到 Core Data 时出错
Posted
技术标签:
【中文标题】将 UIImage 保存到 Core Data 时出错【英文标题】:Error saving UIImage to Core Data 【发布时间】:2012-04-05 12:17:08 【问题描述】:我无法将照片保存到核心数据中。我正在尝试将其保存为实体中设置为“可转换”的属性。我已经看到关于 SO 的各种讨论,并且共识似乎是在 ios5 及更高版本中,我不需要使用编码器,因为 UIImage 现在符合 NSCoding。尝试保存 Core Data 时出现错误。请看下面我用来保存照片的代码......
- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
NSString *mediaType = [info objectForKey: UIImagePickerControllerMediaType];
UIImage *originalImage, *editedImage, *imageToSave;
// Handle a still image capture
if (CFStringCompare ((CFStringRef) mediaType, kUTTypeImage, 0) == kCFCompareEqualTo)
editedImage = (UIImage *) [info objectForKey:UIImagePickerControllerEditedImage];
originalImage = (UIImage *) [info objectForKey:UIImagePickerControllerOriginalImage];
if (editedImage)
imageToSave = editedImage;
else
imageToSave = originalImage;
// Convert image to Data for entry into Core Data
NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(imageToSave)];
// Add image to Core Data
myEntity.attribute = imageData;
NSError *error = nil;
if (![managedObjectContext save:&error])
NSLog(@"Error when saving core data");
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
[[picker parentViewController] dismissModalViewControllerAnimated: YES];
[picker release];
【问题讨论】:
您遇到的错误是什么? 为什么不把图片保存到 Document 目录,只把它的路径保存为 NSString 呢?它的效率比你现在做的要高.. 几分钟前就做了.. 我得到的错误在很大程度上没有帮助:保存核心数据时出错。未解决的错误 [null],[null]。 你为什么不按照我建议的方法?它真的非常高效..看到这个:***.com/questions/2090028/… 你能确认 managedObjectContext 和 myEntity 本身不是 nil 吗? 【参考方案1】:我同意约瑟夫的回答。但是,如果您的图像是(礼貌 - Marcus S. Zarra's answer here),请查看 Apple 对存储图像的建议:
小于 100K;作为二进制属性存储在主表中 小于1M;作为二进制属性存储在辅助表中以避免过度获取 大于1M;存储在磁盘上并将其文件路径存储在 Core Data 表中。从您的代码中,我看到您正在尝试将从相机拍摄的图像保存到核心数据。我们知道现在从手机/iPad 相机拍摄的图像大约为 2.5 Mbs。因此,您很可能会遇到性能问题。因此,我建议您将图像存储在文档目录中,并将其路径保存为 NSString
在您的实体中。这将是一种更有效的方式。
【讨论】:
【参考方案2】:我已经做过很多次了。将存储类型从可转换为二进制数据,您应该没问题。
您还想记住几件事。如果图像很小(1MB 或更少),将其存储在主实体中应该没有问题。如果它更大,出于性能原因,您应该将图像单独存储在实体中。如果图像非常大,您可能需要考虑像上面匿名建议的那样将其存储在文档目录中。
【讨论】:
他正在从相机获取图像,我们都知道现在所有 iPhone/iPad 相机捕获的图像大约为 2.5 Mbs。所以我可以说他可能会遇到性能问题..以上是关于将 UIImage 保存到 Core Data 时出错的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Documents 文件夹中保存 UIImagePicker 中的 UIImage 并获取路径字符串以保存在 Swift 中的 Core Data 中
Core Data 不会从内存中释放 UIImage 数据 (ImageIO_PNG_Data)