Core Data バッドプラクティス

6,094 views
5,850 views

Published on

2013年11月札幌iPhone開発懇談会勉強会プレゼンテーション資料。 iOS CoreData徹底入門 販売記念。CoreData のバッドプラクティスを紹介します。

Published in: Technology

Core Data バッドプラクティス

  1. 1. CoreData バッドプラクティス
  2. 2. お題目 • 簡単な自己紹介 • CoreData 書籍 • バッドプラクティスCoreData • バッドプラクティスからのリカバリ
  3. 3. 簡単な自己紹介 • iPhoneのアプリ開発者 • 頭わるいアプリ開発 • アプリの企画提案(サービス/フレームワークの提案) • 喫茶作業者
  4. 4. 開発アプリ Wifiルーター用アプリ 印刷サービス用アプリ
  5. 5. CoreData の書籍
  6. 6. iOS CoreData徹底入門 • 前半sqlite、後半CoreDataの 構成 • 利用ケースに基づいたサンプ ルコード • マルチスレッドについて言及 なし • バイナリを格納する方法につ いて詳しい
  7. 7. CoreData を使う ユーザが増えるのは うれしいかぎり。
  8. 8. ただしCoreDataで 思わぬ罠に陥る事も…
  9. 9. そもそも使う 必要がある?
  10. 10. SQLライクにデータを永続化&問い合わせ機 能を実現するのであれば(既にsqliteに関する 知識があれば)sqlite も選択肢かも。
  11. 11. 規模がそれ程大きくない場合は、 NSArray、NSDictionary で永続化、 NSPredicate を使って絞り込みが可 能。
  12. 12. 規模がそれ程大きくない場合は、 NSArray、NSDictionary で永続化、 NSPredicate を使って絞り込みが可能。
  13. 13. NSPredicte による データの問い合わせ • NSPredicate によるデータの問い合わせが可能 • 指定方法がNSString のフォーマット分に近い ものが使える(同じではない) • plist で絞り込めるのは(500-1000要素ぐらいが 限界)
  14. 14. NSPredicateについては サンプルコード参照 https://github.com/ notoroid/SimpleSearch
  15. 15. CoreDataの特徴 • NSPredicte によるデータの問い合わせ • データモデルのアップグレードがそこそこ整備(マイ グレーション) • データの永続化とオブジェクト管理が分離されてい る(取り消しやマルチスレッドにも応用可) • オブジェクトっぽく扱える
  16. 16. データの永続化 • オブジェクトの形でデータを永続化できる オブジェクトの形で なければ他の選択肢 で良くないのでは?
  17. 17. データモデルの アップグレード機能がそこそこ整備 • 複数のデータモデルを定義して、データモデ ル間のデータモデルのアップグレードが可能 • データモデル間のアップグレード方法を指定 することができる(自動、手動) • sqlite でもできないことはない
  18. 18. オブジェクトっぽく扱える • NSManagedObject がCoreDataのオブジェク ト。NSManagedObject から値を取得 • NSManagedObject をカスタマイズして、オ ブジェクトのプロパティのように扱うことも 可能
  19. 19. CoreData の立ち位置は? • sqlite や、plist で実現可能な事が重複してい る。 • オブジェクトを永続化することに関して網羅 的だがCoreDataを使う上で抑えておくことが 多い。 • iOS SDKでもミドルウェア的扱い。
  20. 20. CoreData を採用するに あたって • データモデルの継続的アップグレードが必要? • バックグラウンドとフォアグランドでデータ の更新が必要? • 他のアプリ開発でもステレオタイプにデータ を扱いたい?
  21. 21. もしそうでなければ 他の手段を探してみて は?
  22. 22. バッドプラクティス CoreData
  23. 23. CoreData を使う上で 悪い例を紹介
  24. 24. バッドプラクティス① CoreData の ミドルウェアを使う
  25. 25. MagicalRecord • パッケージ管理(CocoaPods) で見つかる • データモデルに基づいてカスタムクラスを自 動生成&マイグレーション機能を提供 • CreDataを使う上で便利な機能を提供
  26. 26. MagicalRecord • カスタムクラス • 無駄に巨大(全文検索の邪魔) • 検索できる有益な情報がCoreDataそのものよ り少ない。 • デフォルトのストレージ位置が BundleDisplayName(アプリの表示名)
  27. 27. デフォルトのストレージ位置が BundleDisplayName(アプリの表示名) • アプリの表示を変えると、以前の保存用デー タのパスを忘れてしまう。 • アプリの表示名を変更するだけで、データベー スが消去されたように錯覚してしまう。
  28. 28. 何が言いたいかと いうと
  29. 29. 初期の開発スピードは稼げる が、メンテナンスに伴う作業 は悲惨なものになる
  30. 30. MagicalRecord へのフォロー • おそらくは、Twitter やFacebookページをなど もオフラインデータの利用を想定したもの • ユーザの貴重なデータを取り扱うことはあま り想定されていないかもしれない。
  31. 31. 技術査定の問題 • 検索経由で探し出したミドルウェアは技術の 査定ができてないかも? • パッケージ管理に対応しているミドルウェア は最良の解決方法?
  32. 32. バッドプラクティス② データの中に画像
  33. 33. データの中に画像 • CoreDataのデータモデルに定義にバイナリ データを指定可能 • イメージもバイナリデータの形で保存可能 • ファイルで保存するよりも管理が楽。
  34. 34. • 本来サムネイルだけだったのがいつの間にか 多用 • 格納する画像解像度を高くすると、永続化デー タのサイズが巨大化。メモリオーバーで落ち る • シミュレータや、最新機種だけでテストする と問題を発見できない
  35. 35. まとめ • ミドルウェア相当のCoreDataに対して、ミドル ウェアは蛇足かも? • パッケージ管理で取り入れるミドルウェアは用途 に応じて査定しましょう。査定しないミドルウェ アを納品するとあなたの信用が目減りします。 • データモデルへの画像を含める事は可能であって も、それが妥当か検討しましょう。
  36. 36. バッドプラクティス からのリカバリ
  37. 37. バッドプラクティス 満載のアプリを リリースしてしまった。
  38. 38. もうお手上げ?
  39. 39. CoreData 様は バッドプラクティス満載の アプリにも救いの手を 差し伸べてくれます。
  40. 40. バッドプラクティス からの脱却 • データモデルをアップグレードして大きなバ イナリデータを外に追い出す。 • データモデルのアップグレードには、データ モデルマッピングを使う。 • バイナリデータを外に書き出すには手動アッ プグレードを用意する。
  41. 41. 新しい属性を追加するだけであれば、データマッ ピングファイルは必要ない。
  42. 42. データモデル内の属性名を変 更程度であればモデルマッピ ングソフトの作成だけで済む。
  43. 43. デモコード
  44. 44. https://github.com/ notoroid/ CoreDataImageMigrati onSample
  45. 45. 注意点 • データモデルの名前にアンダーバー(_) を使う とデータマッピングを読み込まなくなる • 誤ったデータモデルを追加した場合は、手動 でプロジェクトファイルを編集する必要が出 てくる
  46. 46. まとめ • iOS CoreData 徹底入門 が出たことCoreData が身近になりました。 • ステレオタイプにiOSアプリのデータを扱いた いのであれば、この機会に学んでみてはいか がでしょう?
  47. 47. http://irimasu.com Twitter: @notoroid 公式: @irimasu

×