2012-04-05 115 views
2

我在将照片保存到核心数据时遇到问题。我试图将它保存为一个在实体中设置为“可变形”的属性。我已经看到了关于这个的各种讨论,并且共识似乎是在iOS5和更高版本中,我不需要使用编码器,因为UIImage现在符合NSCoding。当我尝试保存核心数据时出现错误。请看下面我用来保存照片的代码...将UIImage保存到核心数据时出错

- (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

你正在收到什么错误? – Zalykr 2012-04-05 12:17:57

+1

为什么不将图像保存到Document目录,只需将其路径保存为NSString?它的方式比你更有效率..刚做了几分钟前.. – 2012-04-05 12:19:24

+0

我得到的错误在很大程度上是无益的:保存核心数据时出错。未解决的错误[null],[null]。 – 2012-04-05 12:27:27

回答

1

我已经做了很多次了。将存储类型从可转换更改为二进制数据,你应该没问题。

你也想记住几件事情。如果图像很小(1MB或更小),则不应将其存储在主实体中。如果它更大,出于性能原因,您应该将图像本身存储在实体中。如果图像非常大,您可能需要考虑将其存储在文档目录中,如上面的匿名提示。

+0

他从相机获取图像,我们都知道现在所有iPhone/iPad相机拍摄的图像大约为2.5 Mbs。所以我可以说他可能会得到性能问题.. – 2012-04-05 13:45:14

2

我同意约瑟夫的回答。但看Apple的建议为,如果你的形象是(礼貌 - Marcus S. Zarra's answer here)存储图像:

  • 小于100K;储存在你的主表中的二进制属性
  • 小于1m;作为二进制属性存储在辅助表中以避免过度取用
  • 大于1M;存储在磁盘上并将其文件路径存储在核心数据表中。

从你的代码我看到的是你试图将从相机拍摄的图像保存到核心数据。我们知道现在从手机/ iPad相机拍摄的图像大约为2.5 Mbs。所以你很可能会遇到性能问题。所以我建议你将图像存储在文档目录中,并将其路径保存为NSString。这将是一种更有效的方式。

+0

请在我的回答中提示我是否有问题。 – 2012-04-05 14:03:25