2012-04-05 20 views
2

写真をコアデータに保存できません。私はそれをエンティティの「変形可能」に設定された属性として保存しようとしています。私はこれについて様々な議論を見てきました。そして、UOSmageが現在NSCodingに準拠しているので、iOS5以上では、コーダを使用する必要はありません。コアデータを保存しようとするとエラーが発生します。写真を保存するために使用しているコードを下に見てください。Core Dataに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

+1

イメージをDocumentディレクトリに保存し、そのパスをNSStringとして保存しないのはなぜですか?その方法はあなたが行っているよりも効率的です..ほんの数分前にしました.. –

+0

私が得ているエラーは、大して役に立たないです:コアデータを保存するときのエラー。未解決のエラー[null]、[null]。 –

答えて

1

私はこれを何度もやっています。ストレージタイプを変換可能からバイナリデータに変更してください。

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

+0

彼はカメラから画像を取得しています。私たちはすべて、iPhone/iPadのカメラ撮影画像が現在約2.5Mbsであることを知っています。だから私は彼がパフォーマンスの問題を得るかもしれないと言うことができます.. –

2

私はジョセフの答えに同意します。しかし、あなたのイメージが(礼儀 - Marcus S. Zarra's answer here)であれば、画像を保存するためのAppleの勧告を見て:

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

あなたのコードからは、カメラから撮影した画像をCore Dataに保存しようとしていることがわかります。私たちは、Phone/iPadカメラから撮影した画像が現在約2.5Mbsであることを知っています。したがって、パフォーマンスの問題が発生する可能性は非常に高いです。だから私はあなたの文書ディレクトリに画像を保存し、あなたのエンティティにNSStringのようなパスを保存するアドバイスをします。より効率的な方法になります。

+0

私は私の答えのどこかに間違っている場合は、プロンプトをしてください。 –

関連する問題