2

写真をコアデータに保存するのに問題があります。エンティティで「Transformable」に設定された属性として保存しようとしています。SOでこれについてさまざまな議論を見てきましたが、iOS5以降では、UIImageがNSCodingに準拠しているため、コーダーを使用する必要がないというコンセンサスがあるようです。CoreDataを保存しようとするとエラーが発生します。写真を保存するために使用しているコードを以下に示します...

- (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];
}
4

2 に答える 2

2

私はジョセフの答えに同意します。ただし、画像が次の場合に画像を保存するためのAppleの推奨事項を見てください(提供:Marcus S. Zarraの回答はこちら):

  • 100K未満;メインテーブルにバイナリプロパティとして保存
  • 1M未満; 過剰なフェッチを回避するために、バイナリプロパティとして補助テーブルに格納します
  • 1Mより大きい; ディスクに保存し、そのファイルパスをCoreDataテーブルに保存します。

あなたのコードから私が見ているのは、カメラから撮影した画像をCoreDataに保存しようとしているということです。現在、電話/iPadカメラから撮影した画像は約2.5Mbsです。したがって、パフォーマンスの問題が発生する可能性は十分にあります。したがって、画像をドキュメントディレクトリに保存し、そのパスをNSStringエンティティと同じように保存することをお勧めします。それはより効率的な方法になります。

于 2012-04-05T14:01:54.823 に答える
1

私はこれを何度もやりました。ストレージタイプを変換可能からバイナリデータに変更すると、問題がないはずです。

また、いくつかのことを念頭に置いておく必要があります。画像が小さい場合(1MB以下)、メインエンティティに画像を保存するのに問題はありません。大きい場合は、パフォーマンス上の理由から、画像をエンティティに単独で保存する必要があります。画像が非常に大きい場合は、上記の匿名の提案のように、ドキュメントディレクトリに画像を保存することを検討してください。

于 2012-04-05T13:26:22.387 に答える