Copyright (C) iPhoneアプリ開発備忘録 All rights reserved.
ブログ内で記したコード、内容の正確性は保証いたしません。
記載内容を実装したことにより発生した不具合・損害等の責任は一切負いません。



2014年09月08日

[覚え書き] Core Dataでバンドル用の大量データをインポートしようとすると全件がインポートされない



リリース当初からCore Dataにデータをバンドルさせるため、テキストデータからインポートしてデータモデルを作ろうとしたが、大量にインポートしようとすると、どうしても最後にインポートするエンテティの末尾数百件がインポートされない現象が発生した。

■アプリのリリース時から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

タグ:IOS Mac apple iPAD iPhone
posted by mobileDeveloper at 01:07 | Comment(0) | TrackBack(0) | Core Data はてなブックマーク - [覚え書き] Core Dataでバンドル用の大量データをインポートしようとすると全件がインポートされない | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/405045699
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック
Apple、Appleのロゴ、App Store、iPodのロゴ、iTunesは、米国および他国のApple Inc.の登録商標です。
iPhone、iPod touch、iPadはApple Inc.の商標です。
iPhone商標は、アイホン株式会社のライセンスに基づき使用されています。
その他、本ブログに記載されている製品名、会社名は、それぞれ各社の商標または登録商標です。