NSManagedObjectに大きな画像などを持たせたいとき

NSManagedObjectに大きな画像などを持たせたいときManagedObjectのアトリビュートをBinary Dataにしてそのまま突っ込んで良さそうです。その際、Allows External Storageオプションをオンにするのを忘れずに!

Core Dataをちゃんと理解しようと思って、最近発売された『Learning Core Data for iOS: A Hands-On Guide to Building Core Data Applications』を読んでいます。

そこで、ちょっと発見があったのでメモ的に書き込みます。画像などをセットする場合の処理です。今まで、サムネイルはCore Dataに入れるけど、大きな画像はURLだけStringアトリビュートでもたせておいて、画像ファイルは別のフォルダに入れていました。

が!そんなコトする必要もなかったみたいです。

AllowsExternalStorage

NSManagedObjectModelの編集をする際に、このAllows External Storageにチェックを入れれば、サイズが小さければCoreData内に、大きければ別の場所保存してURLだけ保持するということを自動でやってくれる模様><。

Binary Data is a good choice for large files because they can be seamlessly stored outside the database using the Allows External Storage attribute setting. With this setting enabled, Core Data will decide whether it is more efficient to store the file inside or outside of the database.

ぬぬぬ。

ちょっと心配だったので他のソースも調べてみました。

stackoverflow

ぬぬぬ。できそうです。なにやら、1MBより小さい場合はsqliteに入れて、それを超えると外の不可視ディレクトリに入れてくれるようです><

Appleのドキュメント

コードで書く場合は、setAllowsExternalBinaryDataStorage:メソッドを呼べばいいようです。What’s Newには、

Managed objects support two significant new features: ordered relationships, and external storage for attribute values. If you specify that the value of a managed object attribute may be stored as an external record, Core Data heuristically decides on a per-value basis whether it should save the data directly in the database or store a URI to a separate file that it manages for you.

と、記載がありました。heuristicallyは自動でと解釈して読んでみると、中身に応じて自動でデータベースに入れるか、外に置いてURIだけ持つか判断してくれるらしいです。ありがたい。。。

2011年頃の書き込みを見るとバグがあって削除時に落ちるという情報もあるけど、もう3年も経ってるしiOS7でだいぶCoreData周りも安定してきたって噂だし大丈夫かな。今度トライしてみよう!


Pocket
LINEで送る

You may also like...