首页 文章

将UIImage保存到Core Data时出错

提问于
浏览
2

我无法将照片保存到核心数据中 . 我试图将其保存为实体中设置为“可转换”的属性 . 我已经在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];
}

2 回答

  • 2

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

    你还想记住一些事情 . 如果图像很小(1MB或更小),则应该没有问题将其存储在主实体中 . 如果它更大,出于性能原因,您应该将图像单独存储在实体中 . 如果图像非常大,您可能需要考虑将其存储在文档目录中,就像上面的匿名建议一样 .

  • 1

    如果您的图像是(Courtesy - Marcus S. Zarra's answer here),我同意Joseph 's answer. But looking at Apple'建议存储图像:

    • 小于100K;在主表中存储为二进制属性

    • 小于1M;存储为辅助表中的二进制属性,以避免过度获取

    • 大于1M;存储在磁盘上并将其文件路径存储在Core Data表中 .

    从您的代码我看到的是您正在尝试将从相机拍摄的图像保存到Core Data . 我们知道从手机/ iPad相机拍摄的图像现在约为2.5 Mbs . 因此,您很可能会遇到性能问题 . 因此,我建议您将图像存储在文档目录中,并将其路径保存为实体中的 NSString . 这将是一种更有效的方式 .

相关问题