web-dev-qa-db-ja.com

コアデータ-画像の保存(iPhone)

ユーザーが自分のアカウントに画像を追加できるアプリケーションがあります。

(カメラまたはフォトライブラリから取得した)画像を保存する方法を知りたいコアデータを使用、ユーザーにバックアップ機能を提供している可能性があり、画像データをサーバ。

Imageモデルオブジェクトを作成し、Userモデルオブジェクトとの1対1の関係を作成するという設計上の提案に遭遇しました(必要な場合を除き、関連付けられたImageオブジェクトは呼び出されません) )。ただし、イメージを実際に格納する方法と、パフォーマンスの点でこれが潜在的に致命的かどうかはわかりません。

これを試みた人からのアプローチと落とし穴についてのアドバイスに感謝します。

46
Urizen

Core Dataに画像データを保存するためのルールは以下の通りです:

  • 関連エンティティ(人物、住所など)に100 kb未満のストア。
  • パフォーマンスの問題を回避するために、関係の反対側にある別個のエンティティーに1 MB未満のストア。
  • ディスクに1 MBのストアを格納し、Core Dataストアのパスを参照します。

変換可能なデータ型を使用して、NSImageを直接Core Dataに保存できます。実際、変換可能なデータ型を使用して、NSCoderプロトコルを実装するあらゆるものを格納できます。

個人的には、この方法で多くの情報を失う可能性があるため、CGImageRefに変換しません。

84
Marcus S. Zarra

この質問をしてから時間が経ちましたが、この問題に関する私の経験を共有したいと思います。


画像の数に制限がない場合、画像をDB内に保存することはお勧めしません。いつか新しいバージョンのデータモデルを追加し、アプリの更新時に古いDBから新しいDBに移行する必要があることに注意してください。時間がかかる。 DBファイルが大きいほど、移行に時間がかかります。

画像をDBに保存する場合は、UIApplicationDelegateapplication: didFinishLaunchingWithOptions:メソッドに永続ストアを追加しないでください。 XX秒以内に移行が完了しない場合、iOSはアプリを終了します。

29
Eldar Markov

落とし穴:あなたは巨大な、扱いにくいsqliteデータベースになるかもしれません。ユーザーに数MBのファイルを1つのステップでサーバーにアップロードしてもらいたいですか?セルラー接続が数秒間途絶した場合、どうしますか?

Core Dataを使用して画像とそのアップロード状態(アップロード:はいまたはいいえ)を管理する方が良いと思います。このようにして、アプリケーションのワークフローに適合するときに画像をアップロードできます。さて、接続数が多いので、少し長持ちします。しかし、よりクリーンなアプローチだと思います...

ITunesについて考えるとき、バックアップについて言えば:ローカルのiPhoneの「ドキュメント」フォルダはとにかく同期されます。

4
Stefan

あなたはaを持っている必要があります、そしてあなたはこのようなことをすることができます:

CGImageRef imageRef = uiImage.CGImage;
CGDataProviderRef dataProvider = CGImageGetDataProvider(imageRef);
NSData *imageData = (NSData*)CGDataProviderCopyData(dataProvider);
[managedObject setValue:imageData forKey:@"data"];

ここで、managedObjectはコアデータイメージオブジェクトであり、@ "data"はバイナリプロパティの名前です。後でイメージを逆シリアル化するために、イメージ形式を保存する必要がある場合もあります。

別のオプションは、イメージをディスクに保存し、パスをコアデータに保存することです。

3
Elfred