我无法将照片保存到核心数据中。我试图将其保存为实体中设置为“可转换”的属性。我已经在SO上看到了关于此的各种讨论,并且似乎在iOS5及更高版本中,我不需要使用编码器,因为UIImage现在符合NSCoding。我尝试保存核心数据时收到错误。请参阅下面我用来保存照片的代码...
- (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];
}
答案 0 :(得分:2)
我同意约瑟夫的回答。但是,如果您的图像是(礼貌 - Marcus S. Zarra's answer here),请查看Apple关于存储图像的建议:
从您的代码中我看到的是您正在尝试将从相机拍摄的图像保存到Core Data。我们知道从手机/ iPad相机拍摄的图像现在约为2.5 Mbs。因此,您很可能会遇到性能问题。因此,我建议您将图像存储在文档目录中,并将其路径保存为实体中的NSString
。这将是一种更有效的方式。
答案 1 :(得分:1)
我已多次这样做了。将存储类型从可转换更改为二进制数据,您应该没问题。
您还想记住几件事。如果图像很小(1MB或更小),则应该没有问题将其存储在主实体中。如果它更大,出于性能原因,您应该将图像单独存储在实体中。如果图像非常大,您可能需要考虑将其存储在文档目录中,就像上面的匿名建议一样。