49
CoreData バッドプラクティス

Core Data バッドプラクティス

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: Core Data バッドプラクティス

CoreData バッドプラクティス

Page 2: Core Data バッドプラクティス

お題目•簡単な自己紹介

• CoreData 書籍

•バッドプラクティスCoreData

•バッドプラクティスからのリカバリ

Page 3: Core Data バッドプラクティス

簡単な自己紹介

• iPhoneのアプリ開発者

•頭わるいアプリ開発

•アプリの企画提案(サービス/フレームワークの提案)

•喫茶作業者

Page 4: Core Data バッドプラクティス

開発アプリWifiルーター用アプリ

印刷サービス用アプリ

Page 5: Core Data バッドプラクティス

CoreData の書籍

Page 6: Core Data バッドプラクティス

iOS CoreData徹底入門•前半sqlite、後半CoreDataの構成

•利用ケースに基づいたサンプルコード

•マルチスレッドについて言及なし

•バイナリを格納する方法について詳しい

Page 7: Core Data バッドプラクティス

CoreData を使う ユーザが増えるのは うれしいかぎり。

Page 8: Core Data バッドプラクティス

ただしCoreDataで 思わぬ罠に陥る事も…

Page 9: Core Data バッドプラクティス

そもそも使う 必要がある?

Page 10: Core Data バッドプラクティス

SQLライクにデータを永続化&問い合わせ機能を実現するのであれば(既にsqliteに関する知識があれば)sqlite も選択肢かも。

Page 11: Core Data バッドプラクティス

規模がそれ程大きくない場合は、NSArray、NSDictionary で永続化、NSPredicate を使って絞り込みが可能。

Page 12: Core Data バッドプラクティス

規模がそれ程大きくない場合は、NSArray、NSDictionary で永続化、NSPredicate を使って絞り込みが可能。

Page 13: Core Data バッドプラクティス

NSPredicte による データの問い合わせ

• NSPredicate によるデータの問い合わせが可能

•指定方法がNSString のフォーマット分に近いものが使える(同じではない)

• plist で絞り込めるのは(500-1000要素ぐらいが限界)

Page 14: Core Data バッドプラクティス

https://github.com/notoroid/SimpleSearch

NSPredicateについては サンプルコード参照

Page 15: Core Data バッドプラクティス
Page 16: Core Data バッドプラクティス

CoreDataの特徴• NSPredicte によるデータの問い合わせ

•データモデルのアップグレードがそこそこ整備(マイグレーション)

•データの永続化とオブジェクト管理が分離されている(取り消しやマルチスレッドにも応用可)

•オブジェクトっぽく扱える

Page 17: Core Data バッドプラクティス

データの永続化•オブジェクトの形でデータを永続化できる

オブジェクトの形でなければ他の選択肢で良くないのでは?

Page 18: Core Data バッドプラクティス

データモデルの アップグレード機能がそこそこ整備

•複数のデータモデルを定義して、データモデル間のデータモデルのアップグレードが可能

•データモデル間のアップグレード方法を指定することができる(自動、手動)

• sqlite でもできないことはない

Page 19: Core Data バッドプラクティス

オブジェクトっぽく扱える

• NSManagedObject がCoreDataのオブジェクト。NSManagedObject から値を取得

• NSManagedObject をカスタマイズして、オブジェクトのプロパティのように扱うことも可能

Page 20: Core Data バッドプラクティス

CoreData の立ち位置は?• sqlite や、plist で実現可能な事が重複している。

•オブジェクトを永続化することに関して網羅的だがCoreDataを使う上で抑えておくことが多い。

• iOS SDKでもミドルウェア的扱い。

Page 21: Core Data バッドプラクティス

CoreData を採用するに あたって

•データモデルの継続的アップグレードが必要?

•バックグラウンドとフォアグランドでデータの更新が必要?

•他のアプリ開発でもステレオタイプにデータを扱いたい?

Page 22: Core Data バッドプラクティス

もしそうでなければ 他の手段を探してみて

は?

Page 23: Core Data バッドプラクティス

バッドプラクティスCoreData

Page 24: Core Data バッドプラクティス

CoreData を使う上で 悪い例を紹介

Page 25: Core Data バッドプラクティス

バッドプラクティス① CoreData の

ミドルウェアを使う

Page 26: Core Data バッドプラクティス

MagicalRecord

•パッケージ管理(CocoaPods) で見つかる

•データモデルに基づいてカスタムクラスを自動生成&マイグレーション機能を提供

• CreDataを使う上で便利な機能を提供

Page 27: Core Data バッドプラクティス

MagicalRecord•カスタムクラス

•無駄に巨大(全文検索の邪魔)

•検索できる有益な情報がCoreDataそのものより少ない。

•デフォルトのストレージ位置がBundleDisplayName(アプリの表示名)

Page 28: Core Data バッドプラクティス

デフォルトのストレージ位置がBundleDisplayName(アプリの表示名)

•アプリの表示を変えると、以前の保存用データのパスを忘れてしまう。

•アプリの表示名を変更するだけで、データベースが消去されたように錯覚してしまう。

Page 29: Core Data バッドプラクティス

何が言いたいかと いうと

Page 30: Core Data バッドプラクティス

初期の開発スピードは稼げるが、メンテナンスに伴う作業は悲惨なものになる

Page 31: Core Data バッドプラクティス

MagicalRecord へのフォロー

•おそらくは、Twitter やFacebookページをなどもオフラインデータの利用を想定したもの

•ユーザの貴重なデータを取り扱うことはあまり想定されていないかもしれない。

Page 32: Core Data バッドプラクティス

技術査定の問題

•検索経由で探し出したミドルウェアは技術の査定ができてないかも?

•パッケージ管理に対応しているミドルウェアは最良の解決方法?

Page 33: Core Data バッドプラクティス

バッドプラクティス② データの中に画像

Page 34: Core Data バッドプラクティス

データの中に画像

• CoreDataのデータモデルに定義にバイナリデータを指定可能

•イメージもバイナリデータの形で保存可能

•ファイルで保存するよりも管理が楽。

Page 35: Core Data バッドプラクティス

•本来サムネイルだけだったのがいつの間にか多用

•格納する画像解像度を高くすると、永続化データのサイズが巨大化。メモリオーバーで落ちる

•シミュレータや、最新機種だけでテストすると問題を発見できない

Page 36: Core Data バッドプラクティス

まとめ•ミドルウェア相当のCoreDataに対して、ミドルウェアは蛇足かも?

•パッケージ管理で取り入れるミドルウェアは用途に応じて査定しましょう。査定しないミドルウェアを納品するとあなたの信用が目減りします。

•データモデルへの画像を含める事は可能であっても、それが妥当か検討しましょう。

Page 37: Core Data バッドプラクティス

バッドプラクティス からのリカバリ

Page 38: Core Data バッドプラクティス

バッドプラクティス 満載のアプリを

リリースしてしまった。

Page 39: Core Data バッドプラクティス

もうお手上げ?

Page 40: Core Data バッドプラクティス

CoreData 様は バッドプラクティス満載の アプリにも救いの手を 差し伸べてくれます。

Page 41: Core Data バッドプラクティス

バッドプラクティス からの脱却

•データモデルをアップグレードして大きなバイナリデータを外に追い出す。

•データモデルのアップグレードには、データモデルマッピングを使う。

•バイナリデータを外に書き出すには手動アップグレードを用意する。

Page 42: Core Data バッドプラクティス

新しい属性を追加するだけであれば、データマッピングファイルは必要ない。

Page 43: Core Data バッドプラクティス

データモデル内の属性名を変更程度であればモデルマッピングソフトの作成だけで済む。

Page 44: Core Data バッドプラクティス
Page 45: Core Data バッドプラクティス

デモコード

Page 46: Core Data バッドプラクティス

https://github.com/ notoroid/

CoreDataImageMigrationSample

Page 47: Core Data バッドプラクティス

注意点

•データモデルの名前にアンダーバー(_) を使うとデータマッピングを読み込まなくなる

•誤ったデータモデルを追加した場合は、手動でプロジェクトファイルを編集する必要が出てくる

Page 48: Core Data バッドプラクティス

まとめ

• iOS CoreData 徹底入門 が出たことCoreData が身近になりました。

•ステレオタイプにiOSアプリのデータを扱いたいのであれば、この機会に学んでみてはいかがでしょう?

Page 49: Core Data バッドプラクティス

http://irimasu.com Twitter: @notoroid 公式: @irimasu