■アプリのリリース時からCore Dataにデータをバンドルしておく方法 [最新版]
http://iphone-app-developer.seesaa.net/article/404883348.html
例えば、複数のエンティティにデータを連続でインポートしてCore DataをSaveしてCommit後、Fetchをかけてインポート件数を確認したところ、下記のようになったとする。
Entity A 250000件
Entity B 70000件
Entity C 25000件
Entity D 1500件
だが、出来上がったsqliteファイルをバンドルファイルとしてプロジェクトにコピーし、このコピーしたsqliteファイルをデフォルトのデータモデルとするようにしたところ、最後にインポートしたEntity Dだけが数百件欠落してしまうことが確認された。
Entity A 250000件
Entity B 70000件
Entity C 25000件
Entity D 1200件 ← 300件欠落する
インポートの順番を入れ替えて実行すると、必ず最後のエンティテイのみが数百件欠落する。
Entity D 1500件
Entity A 250000件
Entity B 70000件
Entity C 24800件 ← 200件欠落する
次にEntity E にもダミーでデータをインポートする処理を実行すると、今度はEntity Dには正しく全件インポートされ、Entity Eは数百件欠落するようになった。
Entity A 250000件
Entity B 70000件
Entity C 25000件
Entity D 1500件
Entity E 24800件 ← 200件欠落する
メモリ容量の問題なのか原因が全く不明であり仕方が無いので、本来バンドル時には0件とするべきEntity Eにダミーでデータをインポートするようにし、その後にEntity E内のデータを全件削除して、このデータモデルをバンドルするようにしたところ、Entity AからEntity Dまで全件がインポートされているのを確認した。
また、大量のデータを複数のエンティティに対して連続してインポートしようとすると、メモリ不足でアプリがクラッシュしてしまうことがあるので、インポート処理は個別に切り分けて実行したり、Mac再起動直後にXcodeとiPhoneシミュレータのみを起動して実行するなど、メモリ不足にならないように気をつけて実行することを推奨する。
バッチ処理でのインポートは、AppleがCore Dataプログラミングガイドに注意事項を記しているので一読しておくこと。
参考記事:Core Dataプログラミングガイド
https://developer.apple.com/jp/devcenter/ios/library/documentation/CoreData.pdf