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